在PHP中使用 mysqli 并防SQL注入

自从 php5 推出 mysqli 后就开始不提倡使用 mysql_ 开头的接口了,现在使用 mysql_connet 通常调试的时候会报警告说这个不该用

mysqli 使用起来其实更简单


$url = "localhost";
$usr = "root";
$paw = "123";
$database = "mdb";

//$link = 0;
$link = mysqli_connect($url,$usr,$paw,$database) 
	or die("Error " . mysqli_error($link));
$query = "SELECT gitid,cid from carts where uid = $uid ";
$result = $link->query($query);
while($row=mysqli_fetch_array($result)){
//do you action
}

PDO其实也是不错的选择,mysqli自然更方便

官网其实已经说明了:http://php.net/manual/en/mysqlinfo.api.choosing.php

下面讲讲如何在服务器端防注入(当然用JS检查表单也很常用)。

SQL注入很容易理解,例如获取表单数据

$postedName = $_POST['name_input'];
$query = "INSERT INTO table_name (name) values ('$postedName')";

那么坏人如果给你的 name_input 里不是个正常名字而是如下这样

jack'"; Drop table table_name; "'-
如果这时候还直接傻乎乎地 query 那就麻烦了。

PHP这个放注入的思路其实就是限制了query语句的自由度:参数就是参数,不要想加个分号变成一个命令。

这样做:

$stmt = $mysqli->prepare("INSERT INTO table_name (name) VALUES (?)");
$stmt->bind_param('s', $postedName);

//只要确保参数在下一步 execute 之前赋值就行了
$stmt->execute();
很简单, 在 prepare 函数里面把参数用 ‘?’ 来替代,然后使用 bind_param 绑定参数。在 bind_param 中,第一个参数 's' 代表了参数的类型与个数(此处为一个字符串类型)。如官方的例子

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);
就是绑定了四个参数,三个为字符串,一个为数字。非常简便。

这样一来就不用怕一个参数被恶意扩展为一个语句来捣乱了。


展开阅读全文

没有更多推荐了,返回首页