帮助我阻止用户输入有害代码

时间:2010-09-11 08:54:14

标签: php security

这个问题一直在我脑海中浮现,我如何完全阻止用户进入一些疯狂的SQL注入。是不是mysql_real_escape_string强大到足以阻止它?我遵循了一些指导方针,虽然有些用户在这里批评了我的代码并且给了我安全性的支持。我无法理解背后的原因。虽然我没有使用$ _GET,但唯一的用户输入是通过评论系统。我只是想确保我不会出错。这是我的示例代码。

$name = htmlspecialchars(strip_tags(mysql_real_escape_string($_POST['com_name'])));

我在大约5个领域使用过相同的东西。你对我的上述代码有什么看法?

4 个答案:

答案 0 :(得分:2)

如果要将用户输入插入数据库,那么mysql_real_escape_string就足够了。更好的是,使用准备好的语句 - PDO或MySQLi。

如果您只是在页面上显示用户数据,则应使用htmlspecialchars()htmlentities()

至于您发布的代码。让我们把它分解。

  • htmlspecialchars - 转换为html 字符分别成为各个实体。
  • strip_tags - 剥离HTML和PHP 来自代码的标签
  • mysql_real_escape_string - 躲避 数据库输入前的字符。

因此,正如您所看到的,您使用的前两个函数似乎反效果。您正在将HTML字符链接到实体中,但您也在剥离标记。

确保在输入数据库mysql_real_escape_string之前确保用户输入安全。或者如前所述,使用预备语句。

答案 1 :(得分:2)

如果无法找到或创建与您的数据库的连接,您对mysql_real_escape_string的调用可能会失败。

在实际执行查询之前,我倾向于尽可能深入地调用此类调用。它可能会稍微破坏我的性能,但我不必担心错过更高的参数(关于sql注入),并且我知道此时我总是有一个与数据库的有效连接。

我在所有用户输入上做的第一件事就是使用FILTER_SANITIZE_SPECIAL_CHARS通过filter_var运行它,然后再对其进行任何操作。

答案 2 :(得分:2)

不,你的代码不太安全,甚至不太明智。

这是a complete answer about SQL injections I posted before
简而言之,mysql_real_escape_string本身并不保护任何东西。它仅在您将数据放在引号中时才有效。

至于htmlspecialchars / strip_tags,两者都与SQL无关,它是HTML保护,而不是SQL。 使用它们都是多余的。只需其中一个即可。我更喜欢htmlspecialchars。

答案 3 :(得分:1)

这个想法不是阻止用户输入它,而是确保你安全地在数据库查询中输入它们。这意味着使用mysql_real_escape_string或使用参数化查询mysqli

/* Prepare an insert statement */
$query = "INSERT INTO myCity (Name, CountryCode, District) VALUES (?,?,?)";
$stmt = mysqli_prepare($link, $query);

mysqli_stmt_bind_param($stmt, "sss", $val1, $val2, $val3);

您还需要确保从数据库中读取的正确html编码字段,以避免用户能够注入html(以及javascript)