PHP+mysql防止SQL注入的方法小结
本文实例讲述了php+mysql防止sql注入的方法。分享给大家供大家参考,具体如下:
sql注入
例:脚本逻辑
$sql = "select * from user where userid = $_get[userid] ";
案例1:
案例2:
案例3:
监控以下方法
sleep() — 一般的sql盲注都会伴随sleep()函数出现,而且一般至少sleep 5秒以上
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()
转义特殊字符((php 4 >= 4.3.0, php 5))(mysql_real_escape_string必须先链接上数据库,否则会报错)
下列字符受影响:
\x00 //对应于ascii字符的null
\n //换行符且回到下一行的最前端
\r //换行符
\ //转义符
'
"
\x1a //16进制数
如果成功,则该函数返回被转义的字符串。如果失败,则返回 false。
2.addslashes()
: 函数返回在预定义字符之前添加反斜杠的字符串 (stripslashes()
实现字符串还原)
预定义的字符有:
单引号(')
双引号(")
反斜杠(\)
null
3.prepared statements(预处理机制)
<?php $mysqli = new mysqli("example.com", "user", "password", "database"); if ($mysqli->connect_errno) { echo "failed to connect to mysql: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; } /* non-prepared statement */ if (!$mysqli->query("drop table if exists test") || !$mysqli->query("create table test(id int)")) { echo "table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; } /* prepared statement, stage 1: prepare */ if (!($stmt = $mysqli->prepare("insert into test(id) values (?)"))) { echo "prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; } /* prepared statement, stage 2: bind and execute */ $id = 1; if (!$stmt->bind_param("i", $id)) { echo "binding parameters failed: (" . $stmt->errno . ") " . $stmt->error; } if (!$stmt->execute()) { echo "execute failed: (" . $stmt->errno . ") " . $stmt->error; } ?>
更多关于php相关内容感兴趣的读者可查看本站专题:《php程序设计安全教程》、《php安全过滤技巧总结》、《php运算与运算符用法总结》、《php基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家php程序设计有所帮助。