作者:懒羊羊2502880053 | 来源:互联网 | 2024-11-08 11:09
本期文章将深入探讨网站如何有效防御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注入了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程笔记行业资讯频道。