Php 如何通过SQL注入确保代码的安全性

Php 如何通过SQL注入确保代码的安全性,php,sql-injection,Php,Sql Injection,我知道我使用此代码时不安全,所以我可以在代码中添加任何内容吗 我已经尝试过我自己的sql注入,他们正在某个地方工作,但我对sql注入不太了解。但由于黑客更聪明,所以他们可以真正入侵我的网站 Url如下所示: http://example.com/profile.php?userID=1 php $userID = $_GET['userID']; $userID = mysql_real_escape_string($userID); $CheckQuery = mysql_query("SE

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

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

Url如下所示:

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

谢谢:|

你可以尝试
类型转换

<?php


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

?>

使用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();
mysql\u查询(sprintf(“SELECT*fromtbl\u用户,其中id='%d',$userID”);
$db=新的mysqli();
$stmt=$db->prepare(“从tbl_用户中选择*,其中id=”?”);
$stmt->bind_参数(“id”,$userID);
$stmt->execute();
$stmt->close();

根本不要使用mysql功能。 使用PDO或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
}
我知道我使用此代码时不安全

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

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

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

只要将每个变量都括在引号中转义特殊字符中,就可以安全地放入查询中。
只有当你忽略了这两条规则中的一条(即逃跑但不引用或引用但不逃跑)-你肯定会有危险。但只要你同时遵守这两条规则,你就安全了

我能猜到的“黑客攻击”的唯一原因是HTML上下文中使用的单个引号。在某些情况下,它可以“隐藏页面上的许多内容”。但是对于SQL,您在这里发布的代码,它是无害的

看,离开这个链接

http://example.com/profile.php?userID=1'
您的代码将生成这样一个查询

SELECT * FROM tbl_user WHERE id='1\''
这对于mysql来说是非常合法的,甚至会返回id=1的记录,因为它会将
1'
转换到
1
并找到记录。这就是为什么没有重定向到tos.php的原因

所以,问题出在其他地方

  • 或者有一个代码不符合我上面发布的规则
  • 或者这个问题根本与SQL无关-因此,您选择了错误的树,因此,仍然保持任何漏洞处于打开状态

最有可能的情况是您必须将您的值回显出来

可能重复而不是重复我检查了它如果您尝试
http://example.com/profile.php?userID=0
-它也会“隐藏很多东西”吗?不,这样不行!这样
(int)
将只是查询字符串的一部分。您可以尝试的是
$userID=(int)$userID;
在执行查询字符串行之前。现在检查查询..这是一个旧网站,如果我尝试更改代码,则需要一个多月的时间:(良好的安全性是无法替代的。不幸的是,如果你的数据库因为使用的安全性差而被黑客攻击,你的公司/你的人很可能会因此陷入麻烦。是的,这是真的。这是一个在线游戏解析错误:语法错误,意外的字符串为什么否决?上面提到的代码中没有解析错误。我只添加了1有意义的代码行,用于确保userID值是一个数字。
if(ctype\u digit($userID))…
当他们使用tos.php时,至少应该将他们带到那里:“我自己尝试过。使用havij。这是hackedok,可能是因为我填写了正确的表名。那么,您使用了其他一些代码。是的,尝试过我知道的所有可能的事情。”