这种SQL字符串格式化方法对代码注入完全安全吗?



我想用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 代码免受注入吗?

首先,这是不好的做法。

在我考虑的两种情况下会很糟糕:

  1. 如果字段不VARCAHR,则INT?这是行不通的。
  2. 如果输入是"it's ok",它将是"it"s ok",如果应该显示用户名,则转换将很乏味。

你的方法会有更多的问题(但我没有考虑过(。最好的方法是使用参数。

最新更新