gpt4 book ai didi

sql-injection - SQL注入(inject)连接vs参数

转载 作者:行者123 更新时间:2023-12-04 05:51:01 26 4
gpt4 key购买 nike

我一直在阅读一篇关于 sql injection attack 的文章,在那里,他们一直在说这个语句很容易受到注入(inject)攻击:
"SELECT * from tblBlah where userId" +userId
但这个查询不是”
"SELECT * from tblBlah where userId = @userId";
我正试图解释为什么会这样。他们都在期待一个参数。可能是第一个查询可以接受来自 URL 的参数,而第二个不能?

最佳答案

在第一个查询的情况下,有人可以为 userId 传递以下值:

 = 3; DELETE FROM tblBlah;

这将是字符串连接,并会导致以下 SQL 语句:
SELECT * from tblBlah where userId= 3; DELETE FROM tblBlah;

当然,这对您的数据库来说将是灾难性的。

我认为在第二个查询的情况下,数据库会在内部将其编译为单个 SELECT陈述。参数的值将插入占位符所在的位置,但仅作为数据。即使我们尝试了以下分配:
@userId = '= 3; DELETE FROM tblBlah;';

我们最终会得到以下查询:
SELECT * from tblBlah where userId = '= 3; DELETE FROM tblBlah;';

换句话说,我们试图注入(inject)代码,但我们真正能做的只是注入(inject)一个字符串参数。这可能会导致错误的查询触发,但不允许恶意用户调用 DELETE .事实上,用户对执行哪个语句的控制权为零。

这是一个简单的示例,展示了预准备语句的强大功能。使用准备好的语句,查询的通用模板或结构在查询实际运行之前就已经编译好了。语句的某些部分具有参数占位符,但是它们不会通过连接来更改查询,而只能通过分配定位值来更改查询。

关于sql-injection - SQL注入(inject)连接vs参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730646/

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