gpt4 book ai didi

sql - 准备好的语句如何防范 SQL 注入(inject)攻击?

转载 作者:行者123 更新时间:2023-12-03 04:21:04 25 4
gpt4 key购买 nike

怎么做prepared statements帮助我们预防SQL injection攻击?

维基百科说:

Prepared statements are resilient against SQL injection, becauseparameter values, which are transmitted later using a differentprotocol, need not be correctly escaped. If the original statementtemplate is not derived from external input, SQL injection cannotoccur.

我不太明白原因。用简单的英语和一些例子进行简单的解释是什么?

最佳答案

这个想法非常简单 - 查询和数据分别发送到数据库服务器。
仅此而已。

SQL注入(inject)问题的根源在于代码和数据的混合。

事实上,我们的 SQL 查询是合法程序。我们正在动态创建这样一个程序,动态添加一些数据。因此,数据可能会干扰程序代码,甚至改变它,正如每个 SQL 注入(inject)示例所示(所有示例都在 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;

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

虽然对于准备好的声明,我们不会改变我们的程序,但它保持不变
这才是重点。

我们首先向服务器发送一个程序

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

其中数据被一些称为参数或占位符的变量替换。

请注意,完全相同的查询被发送到服务器,但其中没有任何数据!然后我们使用第二请求发送数据,基本上与查询本身分开:

$db->execute($data);

所以它不能改变我们的程序并造成任何伤害。
很简单——不是吗?

我必须添加的唯一一点在每本手册中都被省略:

准备好的语句只能保护数据文字,但不能与任何其他查询部分一起使用。
因此,一旦我们必须添加动态标识符(例如字段名称),准备好的语句就无法帮助我们。我有explained the matter recently ,所以我不会重复自己。

关于sql - 准备好的语句如何防范 SQL 注入(inject)攻击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8263371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com