网站如何防范SQL注入

发表于 php, 技术原理 2016-11-14 阅读数: 334

我们知道现在大部分网站的数据库都使用MYSQL,当网站出现如下方这样的表单的时候,表单需要将数据录入数据库,但如果有个人非常熟悉MYSQL的语句,并且知道了表单的名称(和列名称),网站的拥有者并不注意这些的时候,那么他就可以轻松地注入。

表单

如我的这个页面中这个语句,就是非常容易收到攻击的例子。

SQL注入

为了方便解释,我们把它简化一下:

mysqli_query($conn,"insert into XXXX(pick_name) values ('$_POST[pickName]')");

我们知道,它是将表单传过来的 pickName(对应表单中的 拾物名称*) 参数传递到数据库内的XXXX中的pick_name列里

但如果“用户”知道我们的表单名称,它输入:value');Delect from XXXX;--

如此,整个语句变成了:

mysqli_query($conn,"insert into XXXX(pick_name) values ('value');Delect from XXXX;--')");

那么恭喜你,XXXX这个表就消失了。

于是如果我敢这么输入的话,我也把自己的网站黑了。

WWW注入

又比如php手册中这个可怕的例子(MSSQL):

攻击数据库所在主机的操作系统(MSSQL Server)

<?php

$query  = "SELECT * FROM products WHERE id LIKE '%$prod%'";

$result = mssql_query($query);

?>

如果攻击提交 a%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 作为变量 $prod的值,那么 $query 将会变成

<?php

$query  = "SELECT * FROM products

                    WHERE id LIKE '%a%'

                    exec master..xp_cmdshell 'net user test testpass /ADD'--";

$result = mssql_query($query);

?>

MSSQL服务器会执行SQL的这条语句,添加了一个用户,如此攻击者将有可能获得一个账号访问主机。

SQL注入

从上面大家也可以看到,SQL注入的关键就在于能否知道表的名称,如果你还想弄一些小玩意儿,那你还得知道列名。这里和我们的题目无关就不再多讲了。接下来讲一下如何防范SQL注入。

常用的防范措施有两种,一种是预处理语句、还有一种就是参数化查询,这里我们讲预处理语句。

$stmt = $conn->prepare('SELECT * FROM XXXX WHERE name = ?');  

$stmt->bind_param('s', $name);  

$stmt->execute();

bind_param就是将$name变量捆绑进入?中.'s'的意思是$name所对应的变量必须是一个字符串,这样我们就固定了它必须是一个字符串,它不能转化为命令。从而使得SQL注入无效。

欢迎大家关注我的公众号:castofzhq,浏览更多有趣的文章:

部分图片来自网络

幻象客 二维码

Add comment