我是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请求发送的)。
我想知道是否有人能给这些人提供提示,也可以帮助我编写这段代码。显然,后者不像前者那么重要,因为我和其他许多人都想知道如何自己去发现它们。
提前谢谢你。我希望这对其他人有帮助。
发布于 2014-07-12 10:26:59
在没有适当处理的SQL语句中包含的任何值都可能成为SQL注入的矢量。正确处理的手段取决于将值包含在语句中的位置以及如何在语句中解释该值。
您将追溯该值在代码中的路径,并查看如何处理它。
看看您的示例代码,有六个语句都有参数。它们要么作为参数传递给函数,要么来自数据库查询。
前四个语句使用变量值$name和$descriptions,它们通过mysqli_real_escape_string发送,并正确地插入MySQL字符串文本中。这些看起来不错。
但是,第五条语句使用$invite,它来自函数参数$invites,没有正确处理。如果$invites可能受到用户的影响,这对于它起源于POST请求的情况是正确的,那么该语句很容易受到SQL注入的影响。将mysqli_real_escape_string应用于$invite也是一个解决方案。
最后一条语句(虽然我怀疑它已经达到了,因为您不能枚举MySQL结果资源)也有两个变量,如果它们不是整数值,则可能缺少适当的处理。
如果您是一个开发人员,您应该切换到准备语句所提供的参数化语句。在那里,您可以分别传递语句及其参数,数据库负责为您进行适当的处理,因此您不必担心。
https://stackoverflow.com/questions/24711648
复制相似问题