我知道我可以使用存储过程来消除sql注入攻击,但它会使代码膨胀超过我愿意接受并使维护成本高昂。
在我的动态SQL查询中,我想在我的一个表中的2列中搜索一串文本,但在此之前,我希望我的业务层(用c#编写)来清理输入清理。我希望输入有特殊字符(即:#,!,$等)。我必须在搜索字符串中删除以清理它的最小字符集是什么?我认为剥离单引号和双引号就足够了。这是对的吗?
由于
答案 0 :(得分:3)
您无需使用存储过程即可。 (事实上,如果存储过程本身构建动态查询,则存储过程不一定能保证防止注入攻击的安全性。)并且手动转义很难100%安全地进行,并且不建议使用。
相反,使用几乎所有数据库都支持的参数化查询。
答案 1 :(得分:1)
还开始定义用于停止后续语句的分号(必要但不充分)
答案 2 :(得分:1)
如果使用存储过程或参数化语句,则不需要清理任何内容,除非您在过程中在动态SQL中盲目地构建字符串。如果是这种情况,请阅读Erland关于动态SQL的优秀文章:
答案 3 :(得分:0)
你是从一个不安全的方向接近这个。你想要定义应该允许的字符集(检查它们不是特殊的,等等),然后去除那些不在该集合中的所有字符。
您可能还应该将SqlCommand
视为构建发送到数据库的字符串的更安全的方法。