网站上传防止黑客入侵

问题描述:

我的网站上有一个上传表单。实际上我并没有真正包含或排除文件类型。网站上传防止黑客入侵

相反,我使用的是这样的:

$fileUploadName = $target_dir.md5(uniqid($target_file.rand(),true)).".".$imageFileType; 

这将保留该文件类型,但更改文件名随机的一些神秘的类似790cd5a974bf570ff6a303c3dc5be90f

这样黑客就不能上传hack.php文件,并用www.example.com/uploaded_files/hack.php打开它,因为它已经更改为例如。 790cd5a974bf570ff6a303c3dc5be90f.php。在我看来,这是完全安全的。我说得对,这样安全吗?

我认为只有自动执行文件可能是一个问题。自执行文件是否存在?

+0

应用[Kerckhoff的原理](https://en.wikipedia.org/wiki/Kerckhoffs 's_principle)“的攻击者知道除(密码)键以外的系统的所有信息“,攻击者可能知道您使用了文件名的MD5校验和,因此可以推断上传的文件名。 –

+0

为什么在任何情况下都会允许执行上传的文件? – miken32

+0

@ miken32我不明白你的意思。当然,我想避免黑客可以上传文件,然后执行。为了避免这种情况,我使用md5(uniqid($ filename))来改变真正的文件名。这样,我希望黑客不能通过浏览器调用和执行文件,因为他不知道(实际)文件名。当然,如果它是一个自我执行文件,这将不起作用。但是呢。自执行文件甚至存在? – David

您还应该检查上传文件的MIME类型和扩展名(尽管上传时可能很容易伪造)。 如果你希望只图像,你也可以通过执行这样的脚本检查图像的宽度和长度参数:

$size = getimagesize($target_file); 

如果不返回正确的价值观,这是没有图像文件。

你可能想告诉你自己关于像Gifar这样的危险图形。在有自己的文件夹一样/etc/web/uploads/<Random>(../uploads)

+0

好的,但为什么我应该额外检查?用户将无法打电话/打开上传的文件,或者他会? – David

+0

我会尽可能地清理每一个上传内容。如果您期望图像文件,我会通过使用getimagesize来检查图像文件。 有很多情况下,有人可以真正到达上传的文件。例如,网络服务器更新/配置错误可以启用目录浏览。 或者有人可能只是尝试蛮力攻击来查找服务器上的文件(因为它们可以从网上执行)。 – Cruiser

+0

通常人们想对后来上传的文件做些什么。下载它们,在某处显示它们。即使是针对文件或某种索引服务的简单优化脚本,如果情况允许,也可以触发这些文件并执行它。 – Cruiser

认沽上传的文件,而该网站的根是/etc/web/public/或者您可以使用.htaccess创建一个在上传文件夹,并把Deny from all 也uniqid和RAND不加密生成安全值,我还要检查上传的文件是一个图像反正Link to someones isimage functionhttp://php.net/manual/en/function.uniqid.phphttp://php.net/manual/en/function.rand.php

使用file_get_contents,以获得用户的图像