这个问题一直在我脑海中浮现,我如何完全阻止用户进入一些疯狂的SQL注入。是不是mysql_real_escape_string强大到足以阻止它?我遵循了一些指导方针,虽然有些用户在这里批评了我的代码并且给了我安全性的支持。我无法理解背后的原因。虽然我没有使用$ _GET,但唯一的用户输入是通过评论系统。我只是想确保我不会出错。这是我的示例代码。
$name = htmlspecialchars(strip_tags(mysql_real_escape_string($_POST['com_name'])));
我在大约5个领域使用过相同的东西。你对我的上述代码有什么看法?
答案 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)