您的位置:首页 > 编程语言 > PHP开发

【PHP】使用参数绑定防止SQL注入

2015-01-06 18:05 746 查看
<html>
<head>
<title>Sql注入演示</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>

<body >
<form action="" method="post">
<fieldset>
<legend>Sql注入演示</legend>
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密  码:</td>
<td><input type="text" name="password"></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>

<?php

if($_POST['username']){

try{
$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}catch(PDOException $e){
die($e->getMessage());
}

try{
/**
* MySQL预处理和绑定
* 当一条SQL被提交到MySQL的时候并不是立即执行,而是要先被编译为数据库可识别的指令然后再执行
* 预处理的原理是先编译SQL,然后等待数据的传入,这样,当用户输入例如' or 1=1 #'的数据的时候
* 该数据就仅仅作为数据被传入,而不再是SQL语句的一部分,从而达到预防注入的作用
*/
$sql = "select * from users where user=:user and password=:password";
$stmt = $pdo->prepare($sql);//对SQL进行预处理(编译)

//绑定参数
$stmt->bindParam(':user', $_POST['username']);
$stmt->bindParam(':password', $_POST['password']);

//执行命令
$stmt->execute();

if($stmt->rowCount()){
echo "登陆成功!";
}else{
echo "您的用户名或密码输入有误,请重新登录!";
}

}catch(PDOException $e){
die($e->getMessage());
}

}

?>


关于预处理提升SQL效率

过去天真的以为使用PDO的预处理,因为SQL语句编译一次,相对于多条SQL语句,在连续的插入的情况下会提升效率。但在最近的试验中发现并非如此

两套复杂度相同的代码,连续插入5W条数据,在最后的执行结果并未有太大差异

未使用预处理的代码片段

$i=0;
while($i < 50000){
$user = $password = $email = mt_rand();
$sql = "insert into users(user, password, email)values('{$user}', '{$password}', '{$email}')";
$pdo->query($sql);
$i++;
}


使用预处理代码片段

$i=0;
$sql = "insert into users(user, password, email)values(:user, :password, :email)";
$stmt = $pdo->prepare($sql);
while ($i < 50000) {
$param['user'] = $param['password'] = $param['email'] = mt_rand();
$stmt->execute($param);
$i++;
}


最终执行时间对比

未使用预处理使用预处理
[root@localhost pdo]# time php test3.php

real 0m49.901s

user 0m0.118s

sys 0m6.046s
[root@localhost pdo]# time php test4.php

real 0m49.101s

user 0m0.140s

sys 0m6.111s
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: