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

jdgnovmf  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(412)

我想用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。

tct7dpnv

tct7dpnv1#

甚至不可能。
我甚至不打算尝试创建一些可行的修改或建议,因为这是一个失败的案例。他们中的任何一个都会让你陷入错误的安全感。
让我给你一个小的链接列表来介绍你自己:
sql注入备忘单
... 勾选“if语句”或“不带引号的字符串”部分
鲍比table
以及各种各样的问题:
用php清除用户输入的最佳方法是什么?
在mysql中,哪些字符能够导致sql注入
消除危险字符可以避免sql注入吗?
如何防止php中的sql注入?
此代码是否阻止sql注入?
为了防止(我的)sql注入,必须转义哪些字符?
htmlspecialchars和mysql\u real\u escape\u string能保证我的php代码不被注入吗?

kcrjzv8t

kcrjzv8t2#

首先,这是个坏习惯。
我认为有两种情况是不好的:
如果字段不是 VARCAHR 是的 INT ? 这行不通。
如果输入为 "it's ok" ,一定会的 "it"s ok" ,如果要显示用户名,则转换将非常繁琐。
你的方法会有更多的问题(但我没有考虑)。最好的方法是使用参数。

相关问题