我想用Java或C#等语言创建SQL查询。每个人都知道你不能这样做:
sql = "SELECT * FROM T WHERE A='" + someString + "'"
因为这允许代码注入,例如:
someString = "xxx';DROP TABLE T;DECLARE @A CHAR(3) ='xxx"
众所周知,您必须使用大多数语言中可用的标准 API 提供的正确 SQL 参数。
但是由于某种太复杂而无法解释的原因(请假设我的理由很好(,我不能或不想使用正确的参数,并且需要坚持自己格式化字符串的危险方法。
我的问题很简单。以下是否安全:
sql = "SELECT * FROM T WHERE A='" + someString.Replace("'","''") + "'"
如果你认为这取决于RDBMS,请坚持使用MySQL。
甚至不是长镜头。
我什至不会尝试创建一些可行的修改或建议,因为这是一个失败的案例。他们中的任何一个只会让你陷入虚假的安全感。
让我给你一个小的链接列表来介绍你自己:
SQL 注入备忘单
。检查"If 语句"或"不带引号的字符串"部分
鲍比表
以及各种SO问题:
使用 PHP 清理用户输入的最佳方法是什么?
哪些字符实际上能够在 mysql 中导致 SQL 注入
消除危险字符会避免 SQL 注入吗?
如何防止 PHP 中的 SQL 注入?
此代码会阻止 SQL 注入吗?
必须转义哪些字符才能防止 (My(SQL 注入?
htmlspecialchars 和 mysql_real_escape_string 能保护我的 PHP 代码免受注入吗?
首先,这是不好的做法。
在我考虑的两种情况下会很糟糕:
- 如果字段不
VARCAHR
,则INT
?这是行不通的。 - 如果输入是
"it's ok"
,它将是"it"s ok"
,如果应该显示用户名,则转换将很乏味。
你的方法会有更多的问题(但我没有考虑过(。最好的方法是使用参数。