请教php如何防止sql注入
时间:2011-06-17
来源:互联网
请教php如何防止sql注入
作者: 老程 发布时间: 2011-06-17
那就要看你是用什么数据库扩展了!MySQL好像没有解决的方法!如果是MySQLi就有方法解决了!你可以使用mysqli类的prepare方法准备一个SQL语句!这个方法返回的是一个mysqli_stmt类的对象!再用这个对象去绑定要传给MySQL服务器的数据就可以了!也就是说你之前写的那个SQL语句不能传数据而是用MySQLi里面唯一认识的占位符"?"来充当数据传给MySQL服务器就可以了!具体代码如下:
<?php
//用mysqli建立数据库连接
$mysqli=new mysqli("127.0.0.1", "root", "您数据库的密码", "选择一个数据库(在这里写上数据库名,如果您省略了这个参数也可以,只是在创建完mysqli对象之后用select_db()这个方法也可以选择您要使用的数据库)" );
//下面就用一个SELECT语句来做实验吧!例如这里的数据库名为"db"!表名为"user"有"id", "name", "age", "sex"这四个字段!
$stmt=$mysqli->prepare("SELECT * FROM user WHERE id>?");
//下面就是通过mysqli_stmt类中的bind_param方法来绑定参数就行了!
$stmt->bind_param("i", $id); //这个方法的第一个参数是要绑定的数据的数据类型!有四种类型!分别是"i"(integer),"d"(double),"s"(string),"b"(binary)!第二个参数是一个引用(也可以说是一个指针吧在C语言里面)!只需要传一个变量名而不是值过去就好了!这里的变量名是自己定义的!我之所以用$id是因为在这里我只需要向数据库服务器传一个id就好了(再看看上面的那个占位符"?"不就是用来代表id的吗?)!
//然后就是给引用赋值就好了!因为引用的值改变了就可以相当于改变了传给数据库服务器的值了!
$id=4; //假设在user这个表里面有超过4条的记录!而我们就想那处id>4的这里就给$id赋上4!你喜欢可以改!
//传完数据就是执行之前在数据库服务器那边已经准备好那条SELECT语句就好了!在mysqli_stmt类里面的execute方法是用来执行已经准备好的语句的!
$stmt->execute();
//绑定了要传给数据库服务器的数据之后就是绑定SELECT语句返回的结果集!使用bind_result()方法来绑定!
$stmt->bind_result($id, $name, $sex, $age); //这里的变量名也是一个引用!也是自定义的!这里定义的定义的变量名和下面输出表格时用到的变量名一致就行了!
//之后就是怎么处理结果集的了!这不是我要说的重点!下面我就输出一个表格就好了!
$stmt->store_result();
echo '<table align="center" border="1" width="600">';
echo '<caption><h1>'.'TEST'.'</h1></caption>';
$result=$stmt->result_metadata();
while($field=$result->fetch_field()){
echo '<th>'.$field->name.'</th>';
}
while($stmt->fetch()){
echo '<tr align="center">';
echo '<td>'.$id.'</td>';
echo '<td>'.$name.'</td>';
echo '<td>'.$sex.'</td>';
echo '<td>'.$age.'</td>';
echo '</tr>';
}
echo '</table>';
$stmt->free_result();
$mysqli->close();
?>
以上就是代码!只要你改一下数据库密码和改一下表明就ok了!直接拷贝过去修改就行了!我都是用半角写的!可以直接使用了!写了这么多都没有讲真到主题!你说的防止SQL注入!如果您使用的是MySQL在做表单的时候!有的用户在您的表单上直接又写一些SQL语句(当然就不是单纯的SQL语句!还有一些特殊符号来注释掉你原来的SQL而执行他在表单上输入的SQL语句!)这样就会造成SQL注入!被别人入侵您的数据库了!但是如果使用我上面写的这种方法就可以防止SQL注入了!因为你用表单接收的就是那个您要绑定的id!由用户来输入这个id时不管用户在怎么去注释您原来的SQL语句都是不行的!因为它只是作为值来传递给数据库服务器的!所以这样就防止了SQL注入了!使用这个mysqli_stmt这个类还有一个优点就是它准备好一个语句放到数据库服务器那里!每传送一个数据它就执行一次!这样就加快了效率!
好了!我说的就是这么多了!希望对您有帮助吧! ( ^_^ )~~~~~
<?php
//用mysqli建立数据库连接
$mysqli=new mysqli("127.0.0.1", "root", "您数据库的密码", "选择一个数据库(在这里写上数据库名,如果您省略了这个参数也可以,只是在创建完mysqli对象之后用select_db()这个方法也可以选择您要使用的数据库)" );
//下面就用一个SELECT语句来做实验吧!例如这里的数据库名为"db"!表名为"user"有"id", "name", "age", "sex"这四个字段!
$stmt=$mysqli->prepare("SELECT * FROM user WHERE id>?");
//下面就是通过mysqli_stmt类中的bind_param方法来绑定参数就行了!
$stmt->bind_param("i", $id); //这个方法的第一个参数是要绑定的数据的数据类型!有四种类型!分别是"i"(integer),"d"(double),"s"(string),"b"(binary)!第二个参数是一个引用(也可以说是一个指针吧在C语言里面)!只需要传一个变量名而不是值过去就好了!这里的变量名是自己定义的!我之所以用$id是因为在这里我只需要向数据库服务器传一个id就好了(再看看上面的那个占位符"?"不就是用来代表id的吗?)!
//然后就是给引用赋值就好了!因为引用的值改变了就可以相当于改变了传给数据库服务器的值了!
$id=4; //假设在user这个表里面有超过4条的记录!而我们就想那处id>4的这里就给$id赋上4!你喜欢可以改!
//传完数据就是执行之前在数据库服务器那边已经准备好那条SELECT语句就好了!在mysqli_stmt类里面的execute方法是用来执行已经准备好的语句的!
$stmt->execute();
//绑定了要传给数据库服务器的数据之后就是绑定SELECT语句返回的结果集!使用bind_result()方法来绑定!
$stmt->bind_result($id, $name, $sex, $age); //这里的变量名也是一个引用!也是自定义的!这里定义的定义的变量名和下面输出表格时用到的变量名一致就行了!
//之后就是怎么处理结果集的了!这不是我要说的重点!下面我就输出一个表格就好了!
$stmt->store_result();
echo '<table align="center" border="1" width="600">';
echo '<caption><h1>'.'TEST'.'</h1></caption>';
$result=$stmt->result_metadata();
while($field=$result->fetch_field()){
echo '<th>'.$field->name.'</th>';
}
while($stmt->fetch()){
echo '<tr align="center">';
echo '<td>'.$id.'</td>';
echo '<td>'.$name.'</td>';
echo '<td>'.$sex.'</td>';
echo '<td>'.$age.'</td>';
echo '</tr>';
}
echo '</table>';
$stmt->free_result();
$mysqli->close();
?>
以上就是代码!只要你改一下数据库密码和改一下表明就ok了!直接拷贝过去修改就行了!我都是用半角写的!可以直接使用了!写了这么多都没有讲真到主题!你说的防止SQL注入!如果您使用的是MySQL在做表单的时候!有的用户在您的表单上直接又写一些SQL语句(当然就不是单纯的SQL语句!还有一些特殊符号来注释掉你原来的SQL而执行他在表单上输入的SQL语句!)这样就会造成SQL注入!被别人入侵您的数据库了!但是如果使用我上面写的这种方法就可以防止SQL注入了!因为你用表单接收的就是那个您要绑定的id!由用户来输入这个id时不管用户在怎么去注释您原来的SQL语句都是不行的!因为它只是作为值来传递给数据库服务器的!所以这样就防止了SQL注入了!使用这个mysqli_stmt这个类还有一个优点就是它准备好一个语句放到数据库服务器那里!每传送一个数据它就执行一次!这样就加快了效率!
好了!我说的就是这么多了!希望对您有帮助吧! ( ^_^ )~~~~~
作者: 半支烟的日子 发布时间: 2011-06-17
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28