2009-10-26 77 views
1

我知道我可以使用存储过程消除SQL注入攻击,但它会膨胀的代码比我愿意接受更多,并使其维护成本高。净化搜索字符串的动态SQL查询

在我的动态sql查询中,我想在我的一个表中搜索2列中的文本字符串,但在此之前,我希望我的业务层使用c#编写,用于清理消毒输入。我希望输入具有特殊字符(即:#,!,$等)。我必须在搜索字符串中删除最小字符集以清除它?我在想,剥去单引号和双引号就足够了。那是对的吗?

感谢

回答

1

而且分号停止后续语句开始定义(必要但不充分)

0

你从一个不安全的方向接近这一点。你想定义应该被允许的字符集(检查它们不是特殊的,等等),然后去掉那些不在那个集合中的东西。

您应该也可以查看SqlCommand作为构建发送到数据库的字符串的安全方法。

3

您不需要使用存储过程以确保安全。 (事实上​​,如果存储过程本身构造动态查询,存储过程不一定能保证安全性不受注入攻击的影响。)手动转义难以100%安全执行,并且不推荐使用。

而是使用几乎所有数据库都支持的参数化查询。

1

如果使用存储过程或参数化语句,则不需要清理任何内容,除非在过程中在动态SQL中盲目地构建字符串。如果是这样的话,请阅读Erland关于动态SQL的优秀文章:

http://sommarskog.se/dynamic_sql.html