参考文章 : https://www.mudoom.com/php%E5%AE%89%E5%85%A8%E7%BC%96%E7%A0%81/
SQL注入
造成sql注入的原因是因为程序没有过滤用户输入的内容, 本质上是在执行sql时数据和语句混淆,下面举一个例子:
万能密码和万能用户名
正常写法 : select * from table_name where username = 'admin' and password = 'admin'
万能密码 : 利用输入表单构造sql, select * from table_name where username = 'admin' and password = 'admin' or 1 = 1, 要防止非常简单, 对密码进行md5加密比对即可
万能用户名 : select * from table_name where username = 'admin' or 1 = 1 and password = 'admin' , 绝对不要相信用户输入的任何数据。 利用addslashes()转义, 对单引号, 双引号, NULL, 反斜杠(\)进行转义.
预防数据库攻击正确做法: 关闭所有错误提示!!!
1. 不能使用mysqli或PDO时, 可以临时使用addslashes() 转义, 前提是数据库为utf-8编码, 并且参数位于''内
2. 使用mysqli或pdo预编译处理sql, 原理是命令与参数分两次发送到MYSQL, 这样MYSQL就能识别参数与命令
$username = 'root'; $password = '1234abcd'; $driver_options = array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8', ); $pdo = new PDO($dsn, $username, $password, $driver_options); //1.编译统一的结构 $sql = "insert into team values (null, :team_name)"; $stmt = $pdo->prepare($sql); $data_list = array( array('name'=>'国安'), array('name'=>'绿地'), array('name'=>'恒大'), array('name'=>'建业'), array('name'=>'鲁能'), array('name'=>'申花'), ); foreach($data_list as $row) { //2.绑定数据到中间编译结果 $stmt->bindValue(':team_name', $row['name']); //3.执行 $result = $stmt->execute(); var_dump($result); }