假设我有一个Web应用程序,它从用户那里获取输入并将其保存在数据库中。让我们进一步假设没有安全漏洞 - 它正确地逃脱了用户输入,使用绑定参数等等。
必须怀疑从数据库中检索的数据(即潜在的污染/恶意)?
示例(不确定结果,因为我害怕尝试)。这是数据库:
create table mytable (id int primary key, name varchar(50));
create table othertable (name varchar(50), xyz int,
... `name` is an fk ...);
insert into mytable (id, name) values(1, '"abc"; drop table mytable;');
insert into othertable (name, xyz) values('"abc"; drop table mytable;', 45475);
然后我运行这个伪代码(例如,可能来自PHP):
# run query 'select * from mytable where id = 1';
# put the `name` in $name
# run query 'select * from othertable where name = $name'
# $name is not escaped, no other precautions taken
答案 0 :(得分:1)
你必须再次逃脱。所有转义都是'SQL,这不是面向命令',它是数据的一部分'。因此,如果你逃避“'one'”,SQL将存储“\'one \'”,并输出......“'one'”。这意味着你必须重新逃脱。
更好的是,使用mysqli_或PDO中的预处理语句,而不是使用常规的mysql_函数。我正在移动自己的编程方法,因为它们不需要转义。 (基本的想法是,不是发送一个必须用“就地”数据解析的查询字符串,而是通过带占位符的查询字符串发送,然后告诉SQL'记住我之前给你的查询吗?使用值X ,Y和Z在其中。因此,值永远不会有机会破坏实际查询的处理)
答案 1 :(得分:0)
此漏洞发生在您替换$name
的位置。在替换之前总是逃避。