如何防止二阶SQL攻击?

时间:2012-03-22 18:00:15

标签: php sql xss sql-injection code-injection

我在任何地方都使用PHP PDO进行查询,但我读到非常罕见的情况下仍然可能存在“二阶注入”,其中存储了一个不安全的变量,然后在用于另一个声明。

准备好的陈述是否仍能防止这种情况发生?只要我确保总是使用它们?或者我是否需要采取更多预防措施?我还容易受到XSS攻击吗?

如果你们都不介意的话,我还有几个问题,只是出于好奇:

  1. 是否可以使用仅包含字母数字字符,空格和短划线的SQL注入?像select * from something where name='$some_variable'一样。我见过的所有例子似乎都需要其他字符,如分号,引号或双破折号。

  2. 我读过许多SQL示例,其中可以设置unsafe变量以形成另一个语句,例如

    $foo = "foo'); INSERT INTO users (name) VALUES ('hi";
    $bar = ("INSERT INTO users (name) VALUES ('$foo')");
    
  3. 但我刚刚测试过,mysql_query甚至不允许多个语句。我知道您仍然可以在1个语句中进行注射,但是我可以确认您在PHP中没有多个语句的问题吗?

2 个答案:

答案 0 :(得分:3)

不是要击败死者(或者它是一个非常活着的?)马,但是......

仅当SQL引擎将数据作为命令读取时才会发生注入。在一个非常简单的情况下,如果您在数据中允许使用未转义的"字符,并且您的数据在SQL中由"个字符封装,则表明您已启用SQL注入攻击。

阻止任何 SQL注入的关键是在进入SQL语句时正确验证和转义传入数据。一种简单的方法是使用预处理语句,它会为您处理它,允许您安全地将参数传递给SQL语句。

每个数据库库都有自己的转义或使用预准备语句的方式。在MySQL和PHP中,当您使用mysqli_real_escape_string()库时,您应该mysqli使用每个时间段

PDO库有它自己的方式,但如果我没记错的话,准备好的语句是PDO的重要组成部分 - 百分之百地使用它们,你就可以了。

答案 1 :(得分:0)

要防止再次发生XSS攻击,请使用HTML Purifier,而不要使用strip_tags(),请参阅下面的链接以获取更多信息,PDO预处理语句应该适用于SQL注入预防:

http://www.reddit.com/r/PHP/comments/nj5t0/what_everyone_should_know_about_strip_tags/

http://htmlpurifier.org/