『壹』 php中防止SQL注入,该如何解决
php注入,原则上是因为sql拼接引起的。
通常避免sql注入的原则是:
类型校验,比如int类型的字段进行强制转换intval。
避免字符型的sql拼接,使用unhex绕过sql解析截断的字符处理。
举个例子:
select * from pass where username = '$a';
这种情况,当$a="1' or 1 = 1 or '2' = '2"情况时,真个sql变成了
select * from pass where username = '1' or 1 = 1 or '2' = '2' ;
那么这个sql就会改变sql原有语义。
类型校验大家都会,这里就不进行说明了,下面说明下使用unhex来进行字符型字段转码,绕过sql语义解析截断避免sql注入。
使用unhex(bin2hex)后,原有逻辑变成
$a = bin2hex($a);
select * from pass where username = unhex('$a') ;
由于bin2hex,$a转化成16进制数避免了sql注入的风险。
sql执行阶段,优先执行sql语义解析,而后进行unhex('$a') 的运算,所以会把"1' or 1 = 1 or '2' = '2"整个字符串当做一个字段执行,而不会进行解析,避免了sql注入问题~