Php 网站上传防止黑客攻击

Php 网站上传防止黑客攻击,php,security,upload,Php,Security,Upload,我的网站上有一张上传表格。实际上,我并没有真正包括或排除文件类型 相反,我使用的是: $fileUploadName = $target_dir.md5(uniqid($target_file.rand(),true)).".".$imageFileType; 这将保留文件类型,但将文件名更改为一些随机密码,如790cd5a974bf570ff6a303c3dc5be90f 通过这种方式,黑客无法上传hack.php文件并使用www.example.com/upload_files/hack.

我的网站上有一张上传表格。实际上,我并没有真正包括或排除文件类型

相反,我使用的是:

$fileUploadName = $target_dir.md5(uniqid($target_file.rand(),true)).".".$imageFileType;
这将保留文件类型,但将文件名更改为一些随机密码,如
790cd5a974bf570ff6a303c3dc5be90f

通过这种方式,黑客无法上传
hack.php
文件并使用
www.example.com/upload_files/hack.php
打开它,因为它已更改为例如
790cd5a974bf570ff6a303c3dc5be90f.php
。在我看来,这样完全安全。这样安全吗


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

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

$size = getimagesize($target_file);
如果这没有返回正确的值,则它不是图像文件


你可能也想知道Gifar这样的危险图形。

当网站根目录位于
/etc/web/public/
或如果你可以使用
.htaccess
时,将上传的文件放在自己的文件夹中,如
/etc/web/uploads/
(../uploads),并在上传文件夹中创建一个文件,然后将
从所有人中拒绝

此外,uniqid和rand不会生成加密安全值。我还将检查上传的文件是否为图像


使用
file\u get\u contents
获取用户图像

可以,但我为什么要进行额外检查?用户将无法调用/打开上传的文件,或者他会吗?我会尽可能地清理每次上传。如果需要图像文件,我会使用getimagesize检查图像文件。在很多情况下,有人实际上可以访问上传的文件。例如,Web服务器更新/配置错误可能会启用目录浏览。或者有人可以尝试暴力攻击来查找服务器上的文件(假设这些文件可以从web上执行)。通常,人们希望稍后对上载的文件进行处理。下载它们,在某处显示它们。即使是一个简单的文件优化脚本或一些索引服务也可以触发文件,并在环境允许的情况下执行。上传的文件仅限我(网站所有者)使用。用户(或任何用户)在上传后都没有访问权限。如果这些文件再次发生任何事情,并且它们被安全地锁定,我认为您的解决方案应该可以。应用“攻击者知道系统的一切,除了(加密)密钥”,攻击者可能知道您使用了文件名的MD5校验和,因此可以推断上载的文件名。在任何情况下,为什么您允许执行上载的文件?@miken32我不明白您的意思。当然我想避免黑客可以上传文件然后执行。为了避免这种情况,我用md5(uniqid($filename))更改了一些神秘的文件名。这样,我希望黑客不能通过浏览器调用和执行文件,因为他不知道(实际的)文件名。当然,如果这是一个自执行文件,它就不起作用。但你要这样做。甚至存在自执行文件?@JonathanLeffler我想你错过了我正在混合
MD5
uniqid()
$target\u文件
。我认为这应该足够节省,不可破坏,不是吗大卫21分钟前