可能重复:
PHP 图像上传安全检查表
我正在我的网站上设置文件上传表单,用户可以在其中上传图片。为了安全起见,我在重命名文件和存储之前检查图像大小和 mime 类型。
我担心的是如何防止用户不断上传不同的文件并滥用我的服务器。有没有办法防止这种情况?我正在考虑跟踪用户的 IP(通过 $_SERVER["REMOTE_ADDR"] 和 $_SERVER["HTTP_X_FORWARDED_FOR"]),每次上传都有一个时间戳,并将上传限制为每小时 X。任何反馈或建议表示赞赏。
谢谢
可能重复:
PHP 图像上传安全检查表
我正在我的网站上设置文件上传表单,用户可以在其中上传图片。为了安全起见,我在重命名文件和存储之前检查图像大小和 mime 类型。
我担心的是如何防止用户不断上传不同的文件并滥用我的服务器。有没有办法防止这种情况?我正在考虑跟踪用户的 IP(通过 $_SERVER["REMOTE_ADDR"] 和 $_SERVER["HTTP_X_FORWARDED_FOR"]),每次上传都有一个时间戳,并将上传限制为每小时 X。任何反馈或建议表示赞赏。
谢谢
确实,有人在上面指出 $_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 欺骗的可能性几乎为零。