在让用户在查询结束时输入自己的条件时阻止SQL注入

时间:2015-07-20 13:17:12

标签: c# sql sql-injection

在我的程序中,我有一个查询,向用户查看 Contacts 信息。此表通常显示没有过滤器的所有行。我想为用户添加一个选项,以便在SELECT语句的末尾编写自己的条件,以查看他们需要的信息。所以,如果我的主要查询是这样的:

SELECT * FROM CONTACTS

用户可以写条件

WHERE FirstName LIKE '%Michael%'

在文本框中。

但是,我知道这不是很安全,并且容易出现SQL注入。但是如何防止用户输入恶意命令,例如

WHERE 1=1; DROP TABLE Contacts

在文本框中?目前我正在对某些关键字进行检查,例如如果过滤器包含DELETE,DROP,UPDATE等,则查询将不会运行。但我不认为这是一个非常安全的解决方案。

4 个答案:

答案 0 :(得分:2)

你说这不对,这是对的。没有安全的方法可以完全按照自己的意愿行事。任意SQL过滤器意味着用户可以同样使用WHERE id IN (SELECT x FROM OPENROWSET(...))选项,例如,仍然允许执行DROP TABLE

可以做的是提供您自己的过滤器语法,并使用您自己的语法解析器,将其转换为SQL。您可以确保只允许从SQL中安全使用的功能。有些ORM可以提供开箱即用的功能,否则你必须自己创建一些东西。

答案 1 :(得分:2)

允许用户在{SQL}查询"结束时编写" 他们自己的条件,可能会在您的应用程序中创建安全漏洞,使其容易出现问题比如SQL injection attack

如果您仍想继续,请考虑以下几点:

  • 使用正则表达式将输入限制为最基本的形式(例如,电话号码只允许0-9和连字符)
  • 在最低级别(即存储过程)实施您的保护机制
  • 用于存储过程中的动态查询...永远不会将字段名称传递到存储过程
  • 永远不要以超出必要的权限运行。
  • 使用自己的登录名登录应用程序的用户通常只对存储过程具有EXEC权限。
  • 如果使用动态SQL,则应将其局限于读取操作,以便用户只需要SELECT权限。
  • 登录数据库的网站不应具有任何提升的权限,最好只有EXEC和(可能)SELECT权限。
  • 绝不让网站以管理员身份登录!
  • 始终使用参数化语句。
  • 进行代码审查以检查是否存在二阶攻击。
  • 确保错误消息不会泄露应用程序或数据库的内部体系结构。

再次......当你实现它时,要非常非常小心!

其他阅读

答案 2 :(得分:1)

我认为此功能是不可行的,因为它的设计:不仅要求用户了解数据库的工作原理,还需要知道正确的语法数据模型。

尝试通过提供预定义的条件来掩盖这一点,例如"其中用户名包含..."或者"姓氏是"。

在C#端使用参数化查询以确保用户提供的输入已被清理。

答案 3 :(得分:1)

这是不可能回答的。您需要一个允许SQL条件的搜索引擎,这是SQL注入的定义。

以下是一些解决方法的想法:

  • 使用网格控件:您可以在网格中显示查询结果并允许用户访问 使用网格过滤结果。这很容易实现(你不重新发明轮子),它是用户友好的。此外,一些网格提供非常强大的过滤选项。我能看到的唯一缺点就是你经常会从数据库中检索到你真正需要的更多结果。
  • 创建自己的过滤器语法:您可以编写自己的过滤器语法(hvd解决方案)。这将是很多工作,如果你错过了一些东西,你可能最终会遇到安全漏洞。
  • 编写条件构建工具:您可以提供条件构建工具。这非常用户友好,但最终可能不够灵活。
  • 导出为CSV :您可以提供一种工具,将查询结果导出为CSV,以便在 Excel Calc 中轻松利用。对于使用电子表格应用程序的有经验的用户来说,这将非常友好。