参考文章 :  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);
}
View Code

相关文章: