检查字符串中是否有 SQL 注入而无法访问数据库(无参数)

Check if there is SQL injection in a string without access to the database (no parameters)

提问人:LukerMaster 提问时间:2/1/2022 更新时间:2/1/2022 访问量:565

问:

我有一项任务是检查并证明是否有办法在不首先访问数据库的情况下防止 SQL 注入 - 所以没有参数化语句。 这基本上意味着:

有没有办法使用任何类型的工具或框架将 SQL 语句解析为字符串,以证明 SQL 已被注入其中。

任何可用的技术。

起初,我有一个想法来检查SQL是否与这样的特定模式匹配:

让 let 成为用户可以键入的任何类型的字符串。 这是我的 SQL:somewhere

SELECT Id FROM somewhere

此语句的模式如下所示:

SELECT SOME_VALUE FROM SOME_TABLE

然后假设用户写入变量 - (我知道它不是最聪明的 SQL 注入)someTable WHERE 1=1;somewhere

但关键是现在我有一个声明,看起来像这样:

SELECT Id FROM someTable WHERE 1=1;

这有效地为我们提供了一个具有如下模式的语句:

SELECT SOME_VALUE FROM SOME_TABLE WHERE SOME_CONDITION

这与初始模式不匹配:

SELECT SOME_VALUE FROM SOME_TABLE

这是检查是否注入了 SQL 的正确方法吗?我还没有找到任何实际使用这种技术的工具,或者除了参数(需要连接到数据库)之外的任何其他技术。别担心 - 我知道参数是要走的路,这个任务是关于没有与数据库的连接。

数据库 字符串 安全性 SQL 注入

评论

2赞 Tim Schmelter 2/1/2022
正确的方法是不让用户将任何参数作为字符串传递,而只作为参数传递。另外,您指的是什么 rdbms 和编程语言?为什么有人给你这个任务?
0赞 LukerMaster 2/1/2022
就我而言,PostgreSql 和 C#,但实现和语言无关紧要。而且我不是要避免参数,我知道应该使用它们。这只是一个完全不同的任务,我只需要找到一个解决方法 - 如果没有 - 那很好,但一些证据会很好。

答:

-1赞 Nihad Amin 2/1/2022 #1

如果您阻止某些关键字和符号,例如“WHERE”、“AND”、“OR”、“;” 和“=”,那将是一个想法。

但这只是一种幼稚的方法,对于生产环境,您应该使用参数化语句。

评论

0赞 LukerMaster 2/1/2022
我知道参数化语句是要走的路。这只是一个不同类型的问题。