在PHP中使用 mysqli 并防SQL注入

来源:互联网 发布:linux 如何退出vi 编辑:程序博客网 时间:2024/05/16 04:52

自从 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);
就是绑定了四个参数,三个为字符串,一个为数字。非常简便。

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


0 0