10

我已经读了很多书,但仍然不能 100% 理解某些 SQL 注入是如何发生的!

我想从知道的人那里看到基于我的示例的 SQL 注入的具体示例,以便可以复制、测试和修复它。我曾尝试 SQL 注入我的代码但不能,所以我希望有人能证明我不是这样!

1.SQL注入只能通过POST或GET方法发生,这意味着在网站上它应该是post表单,例如“注册或搜索”或像“search.php?tags=love”这样的查询,我说得对吗?

说这可以注入以下具有POST方法的代码吗?

$name     = trim($_POST['username']);
$mail     = trim($_POST['email']);
$password = trim($_POST['password ']);

   if ($errors == "false") {
    $sql = 
        "INSERT INTO 
           clients 
         SET 
           name='" . mysql_real_escape_string($name) . "',
           mail='" . mysql_real_escape_string($mail) . "', 
           password='" . mysql_real_escape_string(sha1($password)) . "'";
           $connection->execute($sql);
        
    }

2.另一个有GET方法:rate.php?like&videoID=250&userID=30

$sql = 
    "SELECT 
        videoID 
     FROM 
        likes 
     WHERE 
        videoID = '" .mysql_real_escape_string($videoID). "' AND UID = '" .mysql_real_escape_string($userID). "' LIMIT 1";
        $connection->execute($sql);

请帮助那些对这个主题感到自由但使用具体例子的人。

提前致谢,
伊利亚

4

2 回答 2

10

当用户输入编码不正确时,就会发生 SQL 注入攻击。通常,用户输入是用户通过查询发送的一些数据,即$_GET$_POST$_COOKIE$_REQUEST$_SERVER数组中的值。但是,用户输入也可以来自各种其他来源,例如套接字、远程网站、文件等。因此,您应该真正将除常量(如'foobar')之外的所有内容都视为用户输入

在您发布的代码中,mysql_real_escape_string用于编码(=转义)用户输入。因此该代码是正确的,即不允许任何 SQL 注入攻击。

请注意,很容易忘记调用 to mysql_real_escape_string- 对于熟练的攻击者来说一次就足够了!因此,您可能希望将现代PDO准备好的语句一起使用,而不是 adodb。

于 2012-08-13T20:00:04.913 回答
2

我最近一直在深入研究这个主题,并想与其他人分享非常有趣的材料,从而使我的问题对每个人都更加完整和有启发性。



来自 YouTube


来自维基百科


来自 OWASP


来自 PHP 手册


来自微软和甲骨文


堆栈溢出


SQL 注入扫描器

于 2012-08-25T16:20:31.863 回答