防止PHP中的文件上载滥用

时间:2012-12-05 19:32:56

标签: php web-applications file-upload

  

可能重复:
  PHP image upload security check list

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

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

由于

1 个答案:

答案 0 :(得分:1)

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

关于其他类型的滥用问题,您可以使用简单的过滤器,例如每个IP只能获得每小时/每天的X字节或总上传(或两者)。如果超过该限制,则使用非常可靠的验证码系统,例如reCAPTCHA。这样你永远不会错过合法的请求和滥用应该是最低限度,而不是强迫每个图片上传都通过验证码。

此外,请记住 NOT 优先于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欺骗的可能性几乎为零。