千家信息网

网站是怎么防范SQL注入

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这期内容当中小编将会给大家带来有关网站是怎么防范SQL注入,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。我们知道现在大部分网站的数据库都是用的MYSQL,当网站出现
千家信息网最后更新 2024年11月22日网站是怎么防范SQL注入

这期内容当中小编将会给大家带来有关网站是怎么防范SQL注入,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

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


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


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

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这个表就消失了。

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

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

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

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

$result = mssql_query($query);

?>

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

$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注入。

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

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

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

$stmt->execute();

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

上述就是小编为大家分享的网站是怎么防范SQL注入了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

0