Php 发现傻瓜的sql注入漏洞

Php 发现傻瓜的sql注入漏洞,php,sql,security,find,code-injection,Php,Sql,Security,Find,Code Injection,我是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 = mys

我是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请求发送)

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


先谢谢你。我希望这对其他人有所帮助。

任何未经适当处理而包含在SQL语句中的值都可能成为SQL注入的向量。正确处理的方法取决于该值在语句中的位置以及在语句中如何解释该值

您可以追溯该值在代码中的路径,并查看其处理方式


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

前四条语句使用变量值
$name
$descriptions
,它们通过
mysqli\u real\u escape\u string
发送,并正确插入到MySQL字符串文本中。这些看起来不错

但是,第五条语句使用了
$invite
,该语句来自函数参数
$invites
,未正确处理。如果
$invests
可能受到用户的影响(对于源自POST请求的情况来说是如此),则该语句容易受到SQL注入的影响。在
$invite
上应用
mysqli\u real\u escape\u string
也是一个解决方案

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


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

将所有内容切换为使用准备好的语句/绑定变量,这样它就不再是问题了。但是,
$invests
值来自哪里?@MarkBaker它们来自post请求,所以我应该添加一个mysqli\u real\u escape\u字符串;真不敢相信我没发现。另外,我现在只想研究准备好的语句和绑定变量(我是一个初学者)