在Where子句中删除查询

时间:2014-06-25 14:09:13

标签: sql sql-server sql-server-2008 tsql

是否有可能在 Where子句中编写删除查询。

示例:

Select ID,Name From MyTable Where ID IN(Delete From MyTable)

这可能很疯狂,但让我解释一下我的情况。在我们的报告工具中,我们支持在查询中输入SQL。 我们将使用我们自己的选择发件人 条款查询,并合并查询输入的用户。

示例:

Select ID,Name From MyTable Where ("Query typed by user")

在这里,用户可以键入任何类型的查询过滤器..

如果他打字类似 ID = 100 ,我们的最终查询会变成这样

Select ID,Name From MyTable Where (ID=100)

我们的一位客户问我们,如果有人将删除查询键入查询过滤器,会发生什么。他觉得这可能是安全漏洞。所以我们在开发环境中尝试过这种可能性。但是sql为以下查询返回错误。

Select ID,Name From MyTable Where ID IN(Delete From MyTable)  

最后,我的问题是,是否有其他可能性在 Where子句选择子句中编写删除查询 ..如果是可能,我该如何限制它?

3 个答案:

答案 0 :(得分:2)

是。他们可以运行删除。他们可以输入:

 1 = 1; DELETE FROM MY_TABLE;

或者甚至在某些方面更糟糕(因为你应该有备份):

1 = 0 UNION SELECT SOCIAL_SECURITY_NUMBER, CREDIT_CARD_NUMBER, OTHER_SENSITIVE_DATA FROM MY_SENSITIVE_TABLE;

现在,在你的情况下很难验证。通常,如果您只是将值传递给过滤器,则可以使用参数化sql来保存自己。但是,您还需要让用户选择一列。在这些情况下,通常我们使用下拉列表允许用户选择预定义的列列表,然后验证列名称服务器端。我们为用户提供一个文本框,输入要匹配的值,然后对其进行参数化。

答案 1 :(得分:1)

这不太可能。但他可以这样做:

Select ID,Name From MyTable Where (ID=100); (DELETE FROM MyTable Where 1 = 1)

使用ID=100); (DELETE FROM MyTable Where 1 = 1代替ID=100

答案 2 :(得分:0)

我相信你的客户正在谈论的是SQL注入,只要你已经采取了适当的方法来阻止其他查询在你的select语句完成后运行,那么你应该没有任何问题让他们键入它是什么你要。 根据我的经验,当您执行select语句时,无法删除任何内容。 只需确保您有查询终结符字符,这样它们就不会写出如下内容。

select column1,column2, from myTable where ID in (1,2); delete from my table
如果您没有采取适当措施防止sql注入发生,那么这将是您客户的有效担心。

您可以让您的SQL报告工具没有更新或删除权限,只是让它具有读取权限。但是,您可以自己处理sql注入安全性。