我已经从http://www.verot.net/php_class_upload.htm构建了一个围绕class.upload的脚本
基本上,我的所有图像都存储在服务器上一个名为/images/的目录中
我构建的脚本基本上是从我的网站(如/xyzDir/tomnjerry.jpg?w=100&h=100&fill=1&color=fff )获取一些参数
然后是mod_rewrite,它将文件从/xyzDir/读取到php脚本中,然后转换宽度和高度并返回图像。
最近,我注意到一些来自土耳其的笨蛋试图将奇怪的字符输入到参数w=和h=中
在我的脚本中,我检查以确保宽度和高度只允许整数,填充可以是1或2,颜色只能是我通过数组检查的确定值。
我只是想看看是否还有其他我应该做的事情,以避免被黑客攻击。
谢谢
发布于 2011-01-22 04:10:50
对于所有用户提供的(或不受信任的)输入,请始终记住,对其进行过滤,将其退出。
读取用户提供的数据时,将其过滤为已知值。请勿列入黑名单!Always always 将您期望得到的内容列入白名单。如果您期望的是十六进制数字,请使用正则表达式进行验证,如:^[a-f0-9]+$。弄清楚你期望的是什么,并朝着它过滤。你的文件名除了字母、数字和.之外都没有别的吗?然后过滤到^[a-z0-9.]+$。但是,不要开始考虑将一些东西列入黑名单。恐怕行不通。
当使用用户数据时,适当地对其进行转义以供手头使用。如果它在数据库中,要么将其绑定为参数化查询,要么使用数据库的转义函数对其进行转义。如果您正在调用shell命令,请使用escapeshellarg()对其进行转义。如果您在正则表达式模式中使用它,请使用preg_quote()对其进行转义。还有更多,但你明白我的意思。
在输出用户数据时,对于您要输出的格式,要正确地对其进行转义。如果要将其输出为HTML或XML,请使用htmlspecialchars()。如果出于某种原因要输出到原始标头,请避开任何换行符(str_replace(array("\r", "\n"), array('\r', '\n'), $string))。等等等等。
但始终使用白名单进行过滤,并始终使用上下文的正确方法进行转义。否则你很有可能会错过一些东西……
发布于 2011-01-22 03:23:04
创建一个验证类来验证您的post参数,如下所示。
class MyValidation
{
public function is_interger($val)
{
return is_int($val);
}
public function within_range($val,$min,$max)
{
if($this->is_interger($val))
{
return ($val < $max && $val > $min);
}
return false;
}
public function is_hex($val)
{
return preg_match("/^([a-f0-9]{3}){1,2}$/",$val);
}
}并使用来验证您的值。
示例:
$Validator = new MyValidation();
if($Validator->is_hex($_POST['color']))
{
//Sweet.
}发布于 2011-01-22 03:16:53
您应该使用intval()来确保宽度和高度是整数
$width = intval($_GET['w']);
$height = intval($_GET['h']);你可以做到
$fill = $fill == 1 ? 1 : 2;这是一个三元运算符,所以如果它是1以外的任何值,它将被设置为2。
至于十六进制的验证,十六进制的规则规定它必须在0-9/A-F的范围内。
$color = preg_replace('/[^0-9a-f]/i', "", $_GET['color']);希望这能有所帮助。(应该注意的是,我建议的代码将执行使其适合您的页面所需的操作,而不是事先确认是有效的)
https://stackoverflow.com/questions/4762824
复制相似问题