转义/清理从数据库中检索的数据

时间:2011-11-28 17:30:01

标签: sql security database-security

假设我有一个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

2 个答案:

答案 0 :(得分:1)

你必须再次逃脱。所有转义都是'SQL,这不是面向命令',它是数据的一部分'。因此,如果你逃避“'one'”,SQL将存储“\'one \'”,并输出......“'one'”。这意味着你必须重新逃脱。

更好的是,使用mysqli_或PDO中的预处理语句,而不是使用常规的mysql_函数。我正在移动自己的编程方法,因为它们不需要转义。 (基本的想法是,不是发送一个必须用“就地”数据解析的查询字符串,而是通过带占位符的查询字符串发送,然后告诉SQL'记住我之前给你的查询吗?使用值X ,Y和Z在其中。因此,值永远不会有机会破坏实际查询的处理)

答案 1 :(得分:0)

此漏洞发生在您替换$name的位置。在替换之前总是逃避。