我有一大堆代码可以做这样的事情:
if (sqlStatement.WillUpdateDatabase)
DoThing1();
else
DoThing2();
目前WillUpdateDatabase
已实施为
public bool WillUpdateDatabase {
get { return statementText.StartsWith("SELECT"); }
}
这可以捕获大多数情况,但SELECT ... INTO ...
会变得更复杂。还有一些其他情况我可能需要考虑。
要明确:这不是为了实现任何类型的安全性。还有其他系统可以检查SQL注入攻击,这段代码只需要选择是做thing1还是thing2。
这似乎应该是一个已解决的问题。有可靠的行业标准方法吗?
更新/澄清:UPDATE Table1 SET Column1 = 'a' WHERE 1 = 2
之类的内容应视为更新。
答案 0 :(得分:3)
正如许多其他人所评论的那样,这确实是一个令人讨厌的问题,并且检查SQL并不是真的会为你削减它,因为你实际上最终会编写一个完整的SQL解析器(这真的会重新发明轮)。您可能必须创建一个只对所有表具有读权限的数据库用户,然后使用该只读用户实际执行要测试的查询,并捕获由于权限违规而导致失败的情况(而不是SQL)语法等)
答案 1 :(得分:-2)
由于您的语句文本仅使用以UPDATE
或INSERT
开头的SQL查询更改值,因此测试您是否尝试更新的一种方法可能如下:
public bool WillUpdateDatabase {
get { return (statementText.StartsWith("UPDATE") || statementText.StartsWith("INSERT") ) }
}
但是您无法知道查询是否会有效地更新表中的某些字段。例如,如果您的查询类似于UPDATE persons SET age = 25 WHERE name = "John"
并且没有名称 John 的条目,则您的查询将尝试更新,但显然无法更新,因为没有更新内容。
修改强>
感谢@NikBo和@Gusman,我将包含替换为 StartsWith 以避免像Nik Bo在下面的评论中解释的任何问题。