Php 如何通过SQL注入确保代码的安全性
我知道我使用此代码时不安全,所以我可以在代码中添加任何内容吗 我已经尝试过我自己的sql注入,他们正在某个地方工作,但我对sql注入不太了解。但由于黑客更聪明,所以他们可以真正入侵我的网站 Url如下所示: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
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,可能是因为我填写了正确的表名。那么,您使用了其他一些代码。是的,尝试过我知道的所有可能的事情。”