微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

准备好的语句如何防止SQL注入攻击?

如何解决准备好的语句如何防止SQL注入攻击?

这个想法很简单-查询和数据被发送到数据库服务器 分开 。 就这样。

sql注入问题的根源在于 的

实际上,我们的SQL查询是 。我们正在动态创建这样的程序,动态添加一些数据。因此,数据可能会干扰 程序代码 ,甚至对其进行更改,正如每个sql注入示例所显示的那样(PHP / MysqL中的所有示例):

$expected_data = 1;
$query = "SELECT * FROM users where id=$expected_data";

会产生一个常规查询

SELECT * FROM users where id=1

而这段代码

$spoiled_data = "1; DROP TABLE users;"
$query        = "SELECT * FROM users where id=$spoiled_data";

会产生恶意序列

SELECT * FROM users where id=1; DROP TABLE users;

之所以起作用,是因为我们将数据直接添加到程序主体中,并且它成为程序的一部分,因此数据可能会更改程序,并且根据传递的数据,我们将有常规输出users删除表。

尽管 这就是重点。

我们先将 程序 发送到服务器

$db->prepare("SELECT * FROM users where id=?");

数据被称为参数或占位符的某个 变量 替代。

请注意,完全相同的查询将发送到服务器,其中没有任何数据!然后,我们通过 第二个 请求发送数据,该请求实际上与查询本身是分开的:

$db->execute($data);

因此它不能更改我们的程序并造成任何伤害。 很简单-是吗?

我必须补充的唯一一件事是在每本手册中始终省略:

预处理语句只能保护 数据文字 ,但不能与任何其他查询部分一起使用。 因此,一旦我们不得不添加一个动态 (例如,一个字段名),准备好的语句就无济于事。

解决方法

准备好的语句如何帮助我们防止SQL注入攻击?

维基百科说:

准备好的语句可以抵御SQL注入,因为稍后需要使用其他协议传输的参数值不需要正确地转义。如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。

我不太清楚原因。用简单的英语和一些例子,简单的解释是什么?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。