在我的程序中,我有一个查询,向用户查看 Contacts 信息。此表通常显示没有过滤器的所有行。我想为用户添加一个选项,以便在SELECT
语句的末尾编写自己的条件,以查看他们需要的信息。所以,如果我的主要查询是这样的:
SELECT * FROM CONTACTS
用户可以写条件
WHERE FirstName LIKE '%Michael%'
在文本框中。
但是,我知道这不是很安全,并且容易出现SQL注入。但是如何防止用户输入恶意命令,例如
WHERE 1=1; DROP TABLE Contacts
在文本框中?目前我正在对某些关键字进行检查,例如如果过滤器包含DELETE,DROP,UPDATE等,则查询将不会运行。但我不认为这是一个非常安全的解决方案。
答案 0 :(得分:2)
你说这不对,这是对的。没有安全的方法可以完全按照自己的意愿行事。任意SQL过滤器意味着用户可以同样使用WHERE id IN (SELECT x FROM OPENROWSET(...))
选项,例如,仍然允许执行DROP TABLE
。
可以做的是提供您自己的过滤器语法,并使用您自己的语法解析器,将其转换为SQL。您可以确保只允许从SQL中安全使用的功能。有些ORM可以提供开箱即用的功能,否则你必须自己创建一些东西。
答案 1 :(得分:2)
允许用户在{SQL}查询"结束时编写" 他们自己的条件,可能会在您的应用程序中创建安全漏洞,使其容易出现问题比如SQL injection attack。
如果您仍想继续,请考虑以下几点:
再次......当你实现它时,要非常非常小心!
答案 2 :(得分:1)
我认为此功能是不可行的,因为它的设计:不仅要求用户了解数据库的工作原理,还需要知道正确的语法和数据模型。
尝试通过提供预定义的条件来掩盖这一点,例如"其中用户名包含..."或者"姓氏是"。
在C#端使用参数化查询以确保用户提供的输入已被清理。
答案 3 :(得分:1)
这是不可能回答的。您需要一个允许SQL条件的搜索引擎,这是SQL注入的定义。
以下是一些解决方法的想法: