【问题标题】:spotting sql injection vulnerabilities for dummies [duplicate]发现假人的sql注入漏洞[重复]
【发布时间】:2014-07-12 09:39:35
【问题描述】:

我是 PHP 和 SQL 的初学者。我在这里问了一个与 sql 注入无关的问题,用户 MarcB 说此代码容易受到注入。

function create_group($name, $description, $invites){
global $link;
  $name = mysqli_real_escape_string($link, $name);
  $description = mysqli_real_escape_string($link, $description);
  $names = mysqli_query($link, "SELECT `group_name` FROM `groups` WHERE `group_name` = '$name'");
$descriptions = mysqli_query($link, "SELECT `group_description` FROM `groups` WHERE `group_description` = '$description'");
  if(mysqli_num_rows($names) == 0 && mysqli_num_rows($descriptions) == 0) {
    mysqli_query($link, "INSERT INTO `groups` (`group_name`, `group_description`) VALUES ('$name', '$description')");
  } else {
    echo 'Group with that name/description already exists.';
  }

  $result = mysqli_query($link, "SELECT `group_id` FROM `groups` WHERE `group_name` = '$name'");

  foreach($result as $resul) {
    foreach($resul as $resu) {
      $group_id = $resu;
    }
  }
foreach($invites as &$invite) {
  $idres = mysqli_query($link, "SELECT `user_id` FROM `users` WHERE `username` = '$invite'");
    foreach($idres as $idarr) {
      foreach($idarr as $id) {
        mysqli_query($link, "INSERT INTO `group_members` (`group_id`, `user_id`, `confirmed?`) VALUES ('$group_id', '$id', 0)");
      }
    }
  }
echo 'Group created!';
}

我认为我属于(相当多的)初学者并且知道什么是 sql 注入,但发现很难发现不是非常明显的漏洞(例如纯粹通过 GET 发送的用户名和密码请求)。

我想知道是否有人可以向这些人提供提示并帮助我编写这段代码。显然,后者不如前者重要,因为我和其他许多人都想知道如何自己发现它们。

提前谢谢你。我希望这对其他人有帮助。

【问题讨论】:

  • 切换一切以使用准备好的语句/绑定变量,这不再是一个问题
  • 但是您的$invites 值从何而来?
  • @MarkBaker 他们来自发布请求,所以我应该添加一个 mysqli_real_escape_string;我不敢相信我没有发现这一点。另外,我现在只是研究一下准备好的语句和绑定变量(我是一个大初学者)

标签: php sql security find code-injection


【解决方案1】:

在没有适当处理的情况下合并到 SQL 语句中的任何值都可能容易成为 SQL 注入的向量。正确处理的方式取决于该值在语句中的位置以及它在语句中的解释方式。

您将追溯值在代码中所采用的路径,并查看它是如何处理的。


查看您的示例代码,有六个语句都有参数。它们要么作为参数传递给函数,要么源自数据库查询。

前四个语句使用变量值$name$descriptions,它们通过mysqli_real_escape_string 发送并正确插入到MySQL 字符串文字中。这些看起来不错。

但是,第五条语句使用了$invite,它来自函数参数$invites,没有被正确处理。如果$invites 可以受到用户的影响,这对于它源自 POST 请求的情况是正确的,那么该语句很容易受到 SQL 注入的影响。在$invite 上应用mysqli_real_escape_string 也是一个解决方案。

最后一条语句,虽然我怀疑它曾经到达过,因为您无法枚举 MySQL 结果资源,但它也有两个变量,如果它们不是整数值,则可能缺乏适当的处理。

如果您是开发人员,您应该切换到准备好的语句提供的参数化语句。在那里,您分别传递语句及其参数,数据库会为您进行适当的处​​理,因此您不必担心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2010-09-28
    • 2020-08-21
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多