既然存在SQL注入,为什么SQL数据库仍然使用脚本语言

既然存在SQL注入,为什么SQL数据库仍然使用脚本语言,sql,security,web,sql-injection,Sql,Security,Web,Sql Injection,我的意思是,如果我们使用一些基于二进制的语言,我们会阻止SQL注入,不是吗?使用的语言不是问题所在 问题是使用来自不可信源的数据构建SQL语句 无论是PHP: $sql = "SELECT * FROM users WHERE id = '$id'"; 或者如果是C语言: sprintf( sql, "SELECT * FROM users WHERE id = '%s'", id ); 在这两种情况下,如果id或$id变量是来自外部数据源的不可信输入,则正在生成的SQL会受到污染。无论哪种

我的意思是,如果我们使用一些基于二进制的语言,我们会阻止SQL注入,不是吗?

使用的语言不是问题所在

问题是使用来自不可信源的数据构建SQL语句

无论是PHP:

$sql = "SELECT * FROM users WHERE id = '$id'";
或者如果是C语言:

sprintf( sql, "SELECT * FROM users WHERE id = '%s'", id );
在这两种情况下,如果
id
$id
变量是来自外部数据源的不可信输入,则正在生成的SQL会受到污染。无论哪种情况,如果攻击者传入
id
;删除表用户,则您正在构建:

SELECT * FROM users WHERE id = ''; drop table users;

避免SQL注入的答案是:不要使用外部数据构建SQL语句

您所说的“基于二进制”是什么意思?你的意思是强类型?当然,如果攻击者可以插入任意文本,原则上他们可以插入任何其他字节字符串?如果没有发件人验证,我们可能会问为什么仍然使用SMTP发送电子邮件。事情就是这样,现在改变它是不可能的。如果你想要一种强类型的语言,你可以在C#中使用一个类似ORM层的实体框架。思想不需要有不存在的理由。事物的默认状态是不存在。如果你有主意,就去做吧。或者描述它,倡导它,说服别人去做。实际上,我不知道您提倡什么,也不知道为什么它会比SQL更好。如果我们要讨论您的SQL替换思想,您必须描述它。@D Stanley我的意思是您不能执行字符串。您只会威胁代码段中的数据,执行可选,使用参数化查询,这是大多数语言都可以访问的(例如PHP mysqli或PDO)“使用参数化查询”正是我在说“不要使用外部数据构建SQL语句”时所指的。这不是一个替代方案;这就是我的建议。问题不在于数据的来源,即使使用“可信”的内部数据构建语句也是错误的。将数据和控制代码分开是很重要的。