首先我们先对常见的sql注入进行了解
当我们从一个表单获取变量后传入到php,需要查询mysql或者存储的时候。
$variable = $_POST['input'];? mysqli_query("INSERT INTO table (column) VALUES ('" . variable . "')");?
用户可以输入诸如 : value'); DROP TABLE table; ,SQL语句就变成这样了:
INSERT INTO table (column) VALUES('value'); DROP TABLE table;')?
如果用户知道表明,table表就会被删掉。那么我们在程序中如何预防呢?
1.addslashes()
addslashes()用于对变量中的' " \和NULL添加\斜杠,进行转移后用于避免传入sql语句的参数格式错误,同时如果有人注入子查询,通过加\可以将参数解释为内容,而非执行语句,避免被mysql执行。addslashes()屏蔽大多数sql
注入。
2.使用预处理查询
使用预处理查询可以有效的防止sql注入,预处理查询可以使mysql认识到哪些是变量不会对其做解析处理,使其完成sql的防注入例如使用mysqli的预处理方法:
$mysqli = new mysqli("host", "user", "password", "database"); $stmt = $mysqli>prepare("SELECT id, name FROM table WHERE id = ?"); $stmt>bind_param(1, $id); $stmt>execute(); $res = $stmt>get_result(); $row = $res>fetch_assoc();
在代码中?的作用是代替变量的位置,然后再bind_param中进行参数绑定,然后执行得到结果。