PHP

PHP:

$SQL = "SELECT goodies FROM stash WHERE secret='" .  
    str_replace("'",'',$_POST['secret']) .  
"'";  

一个邪恶的天才黑客可以将SQL注入到我的SELECT中 - 如何?


我已经想了一会儿,我看不出有什么办法可以将SQL注入到这个语句中。

以单引号开头的SQL字符串在下一个单引号处终止,除非使用反斜线或其他引号( ''' )进行转义。 由于您要删除所有单引号,因此不能有加倍的引号。 如果你逃避了结束语,你会得到一个错误,但没有SQL注入。

但是这种方法有许多缺点:

  • 输入中的单引号将被忽略。
  • 输入中的反斜杠处理不正确 - 它们将被视为转义码。
  • 如果最后一个字符是反斜杠,则会出现错误。
  • 如果稍后扩展查询以添加第二个参数,则会导致SQL注入攻击。
  • 例如:

    $SQL = "SELECT goodies FROM stash WHERE secret='" .  
        str_replace("'",'',$_POST['secret']) .  
    "' AND secret2 = '" .
        str_replace("'",'',$_POST['secret2']) .  
    "'";  
    

    当用参数OR 1 = 1 --调用时OR 1 = 1 --会导致:

    SELECT goodies FROM stash WHERE secret='' AND secret2=' OR 1 = 1 -- '
    

    哪个MySQL会看到如下所示的内容:

    SELECT goodies FROM stash WHERE secret='...' OR 1 = 1
    

    即使在这种情况下不可能导致注入,这些缺点也不适合用于避免SQL注入的通用方法。

    正如已经指出的那样,解决方案是使用准备好的语句。 这是防止SQL注入攻击的最可靠的方法。


    为什么不使用mysql_real_escape_string()或更好的语句? 你的解决方案看起来很傻。


    也许。 最好的方法是:

    $query = sprintf("SELECT goodies FROM stash WHERE secret='%s'",
    addcslashes(mysql_real_escape_string($_POST['secret']),'%_'));
    
    链接地址: http://www.djcxy.com/p/93685.html

    上一篇: php

    下一篇: PHP: Is mysql