Php 使用union和load_file()的SQL注入

Php 使用union和load_file()的SQL注入,php,sql-injection,Php,Sql Injection,我的网站被SQL注入攻击。黑客在URL查询字符串中使用了以下内容: abc-buy.php?sid=144760&op=-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29 如何避免此类攻击?使用zend framework。这将默认阻止它 或者你放在数据库里的所有东西都逃出来了 使用zend框架。这将默认阻止它 或者你放在数据库里的所有东西都逃出来了 始终验证不受信任的输入 所有输入都不可信 如何验

我的网站被SQL注入攻击。黑客在URL查询字符串中使用了以下内容:

abc-buy.php?sid=144760&op=-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29

如何避免此类攻击?

使用zend framework。这将默认阻止它

或者你放在数据库里的所有东西都逃出来了


使用zend框架。这将默认阻止它

或者你放在数据库里的所有东西都逃出来了

  • 始终验证不受信任的输入
  • 所有输入都不可信
  • 如何验证输入取决于输入是什么,但在这种情况下,很明显,
    -3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
    对于op(无论op是什么op)都不是有效的输入

    因此,在本例中,可能只需添加一些代码来检查“op”的值是否与预期值之一匹配

    if ( op != "or" and op != "and" and op != "monkeys" ) {
        raise_exception("Invalid op specified! Go away you trickster!");
    }
    
    对于从用户处收到的每个值,都应该这样做。尽管对于自由格式字段(如电子邮件地址或注释等)更为棘手,但仍然要确保它们是匹配字段的有效数据,并在将任何自由格式字段插入数据库之前对其进行转义。这可能会造成以下两种情况之间的差异:

    INSERT INTO users (username,fullname) VALUES ("bob","Robert"); DROP TABLE users; SELECT 1 WHERE "x"="");
    
    以及:

    功能上的区别在于,对于第一个(未转义)版本,
    删除表用户命令执行,在第二个命令中,您只需插入一个新用户,这个新用户的名字很长,很傻,
    Robert”);DROP TABLE users;选择1,其中“x”=“

  • 始终验证不受信任的输入
  • 所有输入都不可信
  • 如何验证输入取决于输入是什么,但在这种情况下,很明显,
    -3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
    对于op(无论op是什么op)都不是有效的输入

    因此,在本例中,可能只需添加一些代码来检查“op”的值是否与预期值之一匹配

    if ( op != "or" and op != "and" and op != "monkeys" ) {
        raise_exception("Invalid op specified! Go away you trickster!");
    }
    
    对于从用户处收到的每个值,都应该这样做。尽管对于自由格式字段(如电子邮件地址或注释等)更为棘手,但仍然要确保它们是匹配字段的有效数据,并在将任何自由格式字段插入数据库之前对其进行转义。这可能会造成以下两种情况之间的差异:

    INSERT INTO users (username,fullname) VALUES ("bob","Robert"); DROP TABLE users; SELECT 1 WHERE "x"="");
    
    以及:


    功能上的区别在于,对于第一个(未转义)版本,
    删除表用户命令执行,在第二个命令中,您只需插入一个新用户,这个新用户的名字很长,很傻,叫做
    Robert”);DROP TABLE users;选择1,其中“x”=“

    切换到并使用带有占位符的准备语句进行所有操作。

    切换到并使用带有占位符的准备语句进行所有操作。

    正如大多数答案所说,您应该转义保存到数据库中的所有内容(字段占位符)

    但我最近发现,您应该避开查询中的所有占位符,因为如果没有它:

    “FROM子句”的占位符可能允许黑客访问任何表的数据


    “WHERE子句”的占位符可能允许黑客访问当前表中的任何行。这意味着黑客可以在试图登录时以数据库中任何用户的身份访问您的应用程序

    正如大多数答案所说,您应该转义保存到数据库中的所有内容(字段占位符)

    但我最近发现,您应该避开查询中的所有占位符,因为如果没有它:

    “FROM子句”的占位符可能允许黑客访问任何表的数据


    “WHERE子句”的占位符可能允许黑客访问当前表中的任何行。这意味着黑客可以在试图登录时以数据库中任何用户的身份访问您的应用程序

    一些笑话+1,但也不推荐PDO或整个框架。PDO肯定有巨大的优点,但它可以不用它就完成。框架也可以工作,但如果OP仅将其用于此目的,那就有点浪费了——只需坚持标准的转义技巧即可。使用准备好的语句(如PDO)是很好的做法,但这不是不验证输入的借口!如果没有验证您的输入,那么如果您有一个正确设计的模式,并且不进行输入验证,您仍然会成为奇怪的约束冲突的受害者。+1有几个笑话,但也不推荐PDO或整个框架。PDO肯定有巨大的优点,但它可以不用它就完成。框架也可以工作,但如果OP仅将其用于此目的,那就有点浪费了——只需坚持标准的转义技巧即可。使用准备好的语句(如PDO)是很好的做法,但这不是不验证输入的借口!如果没有验证您的输入,如果您有一个正确设计的模式,并且没有进行输入验证,您仍然会成为奇怪的约束冲突的受害者。