我如何能使我的代码从SQL注入安全


How i can make my code secure from 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("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

谢谢:|

使用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_*功能。使用PDO或mysqli

http://php.net/PDOhttp://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
}

我知道我是不安全的,当我使用这个代码

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

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

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

只要你把每个变量都括在引号中转义其中的特殊字符-就可以安全地放入查询中。
如果你省略了这两条规则中的一条(即转义但不引用或引用但不转义),你就肯定会有危险。但只要你遵循这两者,你是安全的。

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

看,从这个链接

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

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

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

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

所以,问题在别的地方。

  • 或者有一个代码不遵循我上面发布的规则
  • 或者这个问题与SQL无关-所以,你是错误的树,因此仍然保持任何漏洞打开

很有可能你必须把你的值回显出来

你可以试试type casting的值

<?php

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