PHP+mysql防止SQL注入的方法小结
本文实例讲述了PHP+mysql防止SQL注入的方法。分享给大家供大家参考,具体如下:
SQL注入
例:脚本逻辑
$sql="SELECT*FROMuserWHEREuserid=$_GET[userid]";
案例1:
SELECT*FROMtWHEREaLIKE'%xxx%'OR(IF(NOW=SYSDATE(),SLEEP(5),1))ORbLIKE'1=1';
案例2:
SELECT*FROMtWHEREa>0ANDbIN(497AND(SELECT*FROM(SELECT(SLEEP(20)))a));
案例3:
SELECT*FROMtWHEREa=1andbin(1234,(SELECT(CASEWHEN(5=5)THENSLEEP(5)ELSE5*(SELECT5FROMINFORMATION_SCHEMA.CHARACTER_SETS)END)));
监控以下方法
SLEEP()—一般的SQL盲注都会伴随SLEEP()函数出现,而且一般至少SLEEP5秒以上
MID()
CHAR()
ORD()
SYSDATE()
SUBSTRING()
DATABASES()
SCHEMA()
USER()
VERSION()
CURRENT_USER()
LOAD_FILE()
OUTFILE/DUMPFILE
INFORMATION_SCHEMA
TABLE_NAME
fwrite()/fopen()/file_get_contents()—这几个是PHP文件操作函数
应对方法:
1.mysql_escape_string()转义特殊字符((PHP4>=4.3.0,PHP5))(mysql_real_escape_string必须先链接上数据库,否则会报错)
下列字符受影响:
\x00//对应于ascii字符的NULL
\n //换行符且回到下一行的最前端
\r//换行符
\//转义符
'
"
\x1a //16进制数
如果成功,则该函数返回被转义的字符串。如果失败,则返回false。
2.addslashes():函数返回在预定义字符之前添加反斜杠的字符串(stripslashes()实现字符串还原)
预定义的字符有:
单引号(')
双引号(")
反斜杠(\)
NULL
3.prepared statements(预处理机制)
connect_errno){ echo"FailedtoconnecttoMySQL:(".$mysqli->connect_errno.")".$mysqli->connect_error; } /*Non-preparedstatement*/ if(!$mysqli->query("DROPTABLEIFEXISTStest")||!$mysqli->query("CREATETABLEtest(idINT)")){ echo"Tablecreationfailed:(".$mysqli->errno.")".$mysqli->error; } /*Preparedstatement,stage1:prepare*/ if(!($stmt=$mysqli->prepare("INSERTINTOtest(id)VALUES(?)"))){ echo"Preparefailed:(".$mysqli->errno.")".$mysqli->error; } /*Preparedstatement,stage2:bindandexecute*/ $id=1; if(!$stmt->bind_param("i",$id)){ echo"Bindingparametersfailed:(".$stmt->errno.")".$stmt->error; } if(!$stmt->execute()){ echo"Executefailed:(".$stmt->errno.")".$stmt->error; } ?>
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php程序设计安全教程》、《php安全过滤技巧总结》、《PHP运算与运算符用法总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。