mysql - 这种 SQL 字符串格式化方法对于代码注入(inject)是否完全安全?

标签 mysql sql string-formatting

我想用 Java 或 C# 等语言创建 SQL 查询。大家都知道你不能这样做:

sql = "SELECT * FROM T WHERE A='" + someString + "'"

因为这允许代码注入(inject),例如:

someString = "xxx';DROP TABLE T;DECLARE @A CHAR(3) ='xxx"

众所周知,您必须使用大多数语言中可用的标准 API 提供的正确 SQL 参数。

但是由于某种太复杂而无法解释的原因(请假设我的理由是好的),我不能或不想使用正确的参数,并且需要坚持自己格式化字符串的危险方法。

我的问题很简单。以下安全吗:

 sql = "SELECT * FROM T WHERE A='" + someString.Replace("'","''") + "'"

如果您认为这取决于 RDBMS,请坚持使用 MySQL。

最佳答案

根本就不是。

我什至不会尝试创建一些可行的修改或建议,因为这是一个失败的案例。其中任何一个都会让你陷入虚假的安全感。

让我给您一个简短的链接列表来介绍您自己:

SQL Injection Cheat Sheet

...检查“If 语句”或“不带引号的字符串”部分

Bobby tables

以及各种SO问题:

What's the best method for sanitizing user input with PHP?

Which characters are actually capable of causing SQL injection in mysql

Does eliminating dangerous characters avoid SQL-injection?

How can I prevent SQL injection in PHP?

Does this code prevent SQL injection?

What characters have to be escaped to prevent (My)SQL injections?

Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

关于mysql - 这种 SQL 字符串格式化方法对于代码注入(inject)是否完全安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853374/

相关文章:

mysql - 在 mysql 中选择带有 order by 的案例

php - ROLE_ADMIN 没有登录错误的路径

java - 从 csv 文件的 1 列中删除前导零

c - 在 C 中打印 char[] 的一部分的最简单方法

mysql - 我可以获得每小时计数(包括没有数据的小时数)吗?

mysql - 在php mysql中使用where条件从两个表中选择数据

sql - PostgreSQL 和多个匹配行

sql - SQL 中是否需要 ID 列?

sql - 列存储索引和 nvarchar(max)

python - 将精度作为参数传递给 python 格式