1

可能重复:
PHP 图像上传安全检查表

我正在我的网站上设置文件上传表单,用户可以在其中上传图片。为了安全起见,我在重命名文件和存储之前检查图像大小和 mime 类型。

我担心的是如何防止用户不断上传不同的文件并滥用我的服务器。有没有办法防止这种情况?我正在考虑跟踪用户的 IP(通过 $_SERVER["REMOTE_ADDR"] 和 $_SERVER["HTTP_X_FORWARDED_FOR"]),每次上传都有一个时间戳,并将上传限制为每小时 X。任何反馈或建议表示赞赏。

谢谢

4

1 回答 1

1

确实,有人在上面指出 $_FILES[x]['type'] 可以很容易地任意更改。确保从不重命名任何内容.php或任何其他已解析/执行的文件,例如.shtml... 避免这种情况的一种方法是,当您将图像回传给用户时,始终使用单个 php 脚本将其返回并使用类似readfile()这样的内容永远不会被解释。此外,如果您只接受图像,则可以使用简单的方法getimagesize()帮助验证它是真实图像。但再一次,请注意,确保用户上传的内容永远不会被执行,特别是通过上传,然后通过他们的网络浏览器访问上传的文件。我只是在说明一点,我可以想象有人可能会花费足够的时间来制作一个有效的 JPEG 文件,虽然它会解析通过,但getimagesize()如果执行 .php. 这是一个很长的镜头,但你必须为任何事情做好准备。:)

关于其他类型的滥用,您可以使用简单的过滤器,例如每个 IP 每小时/天仅获取 X 字节或总上传量(或两者兼而有之)。如果他们超过了这个限制,那么使用一个非常可靠的验证码系统,比如 reCAPTCHA。这样一来,您就不会错过合法的请求,并且滥用应该是最低限度的,而不是强制每张图片上传都经过验证码。

此外,请记住不要优先于 X-FORWARDED-FOR。我实际上见过这样的代码:

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
  $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else { 
  $ip = $_SERVER['REMOTE_ADDR'];
}

这是极其错误的。X-FORWARDED-FOR可以由转发代理服务器发送,如果它愿意的话。它也可以由任何东西发送,以欺骗傻瓜认为他们的 IP 实际上不是。

只要您将 REMOTE_ADDR 与 HTTP_X_FORWARED_FOR 结合使用(并且从不信任 HTTP_X_FORWARDED_FOR,仅将其用作辅助参考),.. 实际 IP 欺骗的可能性几乎为零。

于 2012-12-05T20:35:47.717 回答