06-自己定义函数进行校验
如果现有的转换函数仍然不能满足要求,则需要自己编写函数进行输入校验。输入验证是一个很复杂的问题。输入验证的途径可以分为以下几种:
整理数据使之变得有效;
拒绝已知的非法输入;
只接受已知的合法输入。
因此,如果想要获得最好的安全状态,目前最好的解决办法就是,对用户提交或者可能改变的数据进行简单分类,分别应用正则表达式来对用户提供的输入数据进行严格的检测和验证。
下面采用正则表达式的方法提供一个验证函数,以供读者参考。
已知非法符号有:“’ ”、“;”、“=”、“(”、“)”、“/”、“/”、“%”、“+”、“”、“>”、“<”、“--”、“[”和“]”。
其实只需要过滤非法的符号组合就可以阻止已知形式的攻击,并且如果发现更新的攻击符号组合,也可以将这些符号组合增添进来,继续防范新的攻击。特别是空格符号和与其产生相同作用的分隔关键字的符号,例如“/**/”,如果能成功过滤这种符号,那么有很多注入攻击将不能发生,并且同时也要过滤它们的十六进制表示“%XX”。
由此,可以构造如下正则表达式:
(|\'|(\%27)|\;|(\%3b)|\=|(\%3d)|(|(\%28)|)|(\%29)|(\/)|(\%2f%2a)|(\/)|(\%2a%2f)|+| (\%2b)|\<|(\%3c)|>|(\%3e)|(--))|[|\%5b|]|\%5d)
根据上述的正则表达式,可以提供一个函数(以PHP举例),可以防范大多数的SQL注入,具体函数如下:
function SafeRequest ($ParaName, $ParaType)
{
/ ---传入参数--- /
/ ParaName:参数名称-字符型 /
/ ParaType:参数类型-数字型(1表示参数是数字或字符,0表示参数为其他)/
if ($ParaType == 1)
{
$re = "/[^\w+$]/";
}
else
{
$re = "/(|\'|(\%27)|\;|(\%3b)|\=|(\%3d)|(|(\%28)|)|(\%29)|(\/) |(\%2f%2a)|(\ /)|(\%2a%2f)|+|(\%2b)|\<|(\%3c)|>|(\%3e)|(--))|[|\%5b|]|\%5d)/";
}
if (preg_match($re, $ParaName) > 0)
{
echo("参数不符合要求,请重新输入!");
return 0;
}
else
{
return 1;
}
}