2011-11-28 28 views
1

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

该漏洞发生在您替换$name点。在替换之前总是逃脱。

1

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

更好的是,不是使用常规的mysql_函数,而是使用来自mysqli_或PDO的预准备语句。我正在移动自己的编程方法,因为它们避免了转义。 (其基本思想是,不是发送一个查询字符串,该字符串必须与数据'就地'解析,你发送一个查询字符串与占位符,然后告诉SQL'记得我先前给你的查询?使用值X ,Y和Z,结果,这些值从来没有机会破坏实际查询的处理)