0

我知道当我使用此代码时我不安全,所以我可以在我的代码中添加任何内容吗?

我已经尝试过我的自我 sql 注入,它们在某个地方工作,但并不多,因为我对 sql 注入了解不多。但由于黑客更聪明,所以他们可以真正破解我的网站。

网址看起来像这样:

http://example.com/profile.php?userID=1

php

$userID = $_GET['userID'];
$userID = mysql_real_escape_string($userID);
$CheckQuery = mysql_query("SELECT * FROM tbl_user WHERE id='$userID'");

$CheckNumber = mysql_num_rows($CheckQuery);
if ($CheckNumber !== 1)
{
    header("Location: tos.php");
}

我试过了:

http://example.com/profile.php?userID=1'

这隐藏了现场的许多东西。

当我尝试

http://example.com/profile.php?userID=1' UNION SELECT * FROM tbl_user; with havij it was hacked

谢谢:|

4

4 回答 4

0

根本不要使用 mysql_* 功能。使用 PDO 或 mysqli。

http://php.net/PDO http://php.net/mysqli

PDO 将为您转义您的数据。

但是对于您当前的代码:

$userID = $_GET['userID'];
$userID = mysql_real_escape_string($userID);

if(ctype_digit($userID))
{
    $CheckQuery = mysql_query("SELECT * FROM tbl_user WHERE id='$userID'");

    $CheckNumber = mysql_num_rows($CheckQuery);
    if ($CheckNumber !== 1)
    {
        header("Location: tos.php");
    }
} else {
    // THE USER ID IS NOT ALL NUMBERS, CREATE AN ERROR
}
于 2013-05-22T07:48:38.603 回答
0

使用 mysqli::prepare 或至少 sprintf

mysql_query(sprintf("SELECT * FROM tbl_user WHERE id='%d'", $userID);

$db = new mysqli(<database connection info here>);

$stmt = $db->prepare("SELECT * FROM tbl_user WHERE id='?'");
$stmt->bind_param("id", $userID);
$stmt->execute();
$stmt->close();
于 2013-05-22T07:44:15.610 回答
0

我知道我在使用此代码时不安全

这种说法是错误的。
事实上,这段代码非常安全。

您在下面提供的任何代码都不会造成任何伤害。为什么你认为它不安全?

不推荐这种方式,是的。而且您用来格式化查询的方式可能会导致其他查询的注入。但是目前的代码是完全安全的。

只要您将每个变量括在引号中在其中转义特殊字符 - 就可以安全地进行查询。
仅当您忽略这两条规则之一(即转义但不引用或引用但不转义)-您肯定处于危险之中。但只要你同时关注两者,你就是安全的。

我能猜到的“黑客”的唯一原因是HTML 上下文中使用的单引号。在某些情况下,它可以“在页面上隐藏很多东西”。但是对于 SQL,使用您在此处发布的代码,它是无害的

看看这个链接

http://example.com/profile.php?userID=1'

您的代码将产生这样的查询

SELECT * FROM tbl_user WHERE id='1\''

这对于 mysql 来说是相当合法的,甚至会返回id=1 的记录,因为它会强制1'转换1并找到记录。这就是为什么没有重定向到 tos.php 的原因。

所以,问题出在其他地方。

  • 要么有不符合我上面发布的规则的代码
  • 或者这个问题根本与 SQL 无关 - 所以,你在吠叫错误的树,因此仍然保持任何漏洞开放

很可能你必须呼应你的价值观

于 2013-05-22T08:07:50.543 回答
-1

你可以试试type casting这个值

<?php


$CheckQuery = mysql_query("SELECT * FROM tbl_user WHERE id='".(int)$userID."'");

?>
于 2013-05-22T07:43:32.990 回答