我的问题基本上是这样的:如果我使用参数化语句/prepared语句将用户输入字符串插入到表中,然后获取该值并将其用于动态构造表的列值,这是否允许我使用sqlinjection?
具体示例:
如果我使用参数化语句将用户的输入字符串存储到表中,则从该表中选择该文本并将其存储在程序中的局部变量(string local variable)中,然后创建一个具有以下内容的表:
"CREATE TABLE InjectFree (" + localVariable + " TEXT)"
我的localvariable是否没有可注入的sql代码?我知道有替代方法(可能会使用替代方法,只是为了安全起见),但我想我只是想知道参数化一个值到底能做什么,它对存储在表中的数据有什么影响。
最佳答案
如果使用参数化查询,则查询和数据将分别提供给数据库。这有几个影响…
它允许rdbms查看查询是否与该查询以前的实例相同。(如果将数据作为静态值嵌入到查询字符串中,rdbms将看不到查询是相同的,只有数据发生了更改。)这允许重复使用执行计划和rdbms的其他有益特性。
它简化了数据验证。这与注射攻击有关。无论参数中替换了什么值,数据始终只是数据。它永远不会被当作查询的一部分。
然而,后一点也意味着你不能这样做…
INSERT INTO @tableName(@fieldName) VALUES (@dataValue)
每个参数都被视为一个数据项。它不是一个松散绑定的脚本,
@tableName
中的值不会被替换到脚本中。查询必须使用表名和字段名进行硬编码。只有真正的数据项才能作为参数传递。这通常感觉像是对Java脚本等用户的一种限制。然而,正是Mecahnism阻止了SQL注入攻击。这是件好事:)
这意味着要允许用户定义数据定义语言(如创建表),需要自己将字符串的不同部分连接在一起。实际上,无论您在这里做什么来保护自己免受sql注入攻击,都会有人找到解决方法。
一旦您允许用户指定表名、字段名等,您就会立即受到攻击。唯一安全的方法是有一个允许字符串的白名单。
关于sql - 参数化语句是否实际上会更改数据库中存储的数据以防止SQL注入(inject)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11433054/