SQL注入,最简单的解决方案

use*_*799 0 sql t-sql sql-server oracle plsql

如果我只是用双引号替换所有传入的单引号,我不确定有人会破坏我的SQL.有人可以启发我的Oracle和SQL Server示例吗?谢谢.

string sql1 = "select * from users where user_id = '" + "O'Reily".Replace("'", "''").Replace("\", "") + "'";
Run Code Online (Sandbox Code Playgroud)

==>"从user_id ='O''Reily'的用户中选择*

string sql2 = "select * from users where user_id = '" + "O'''Reily".Replace("'", "''").Replace("\", "") + "'";
Run Code Online (Sandbox Code Playgroud)

==>"select*from users user_id ='O''''''Reily"

更新:斜杠'\'是应用程序中的受限字符,在查询中使用之前将被删除.双短划线可以很容易地添加到受限字符列表中.

God*_*eke 16

参数化您的变量.认真.所有现代环境都有这样的设施,您不必担心转义序列,例如\'将转换为您的方案(在Oracle中),这将成为转义报价和常规(终止)报价.

还有很多其他技巧可以解决这个问题,我没有列举,因为它们没有帮助.

再次:参数化您的变量.认真.如果您不学习如何使用参数化,您成为另一个被黑客入侵的统计数据.

编辑:阅读保罗答案中的链接,这是另一个:http://unixwiz.net/techtips/sql-injection.html

无论你认为你的卫生条件多么聪明,你做错了.特别是如果你必须处理多个后端.

用字符串构建查询是为数不多的让我们解雇的人之一......程序员给公司带来的风险大于他们带到桌面上的任何其他东西(特别是在我们说清楚之后)我们不会在第一天接受这样的代码,并提供一个实体框架,使这些东西变得不必要).

  • 参数化不进行字符串操作,这是其中一个好处.相反,参数与命令字符串一起发送,就像您的语言中的函数调用的参数一样.在服务器端解析参数时,命令字符串已经应用了所有转义并且参数具有实际类型.这意味着"O'Dell"作为参数实际上是"O'Dell"而不是"O'Dell"被逃脱.它还意味着500是整数参数中的整数,而不是"500".整数参数将拒绝"ABCD",就像您的语言中的函数一样. (2认同)