2010-09-11 44 views
2

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

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

我对5个字段使用了相同的内容。你对我的上面的代码有什么看法?

回答

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的)

+0

我不希望我的用户输入任何html或javascript代码,它应该只是这个项目的普通文本。你不觉得我的代码正在照顾它吗? – 2010-09-11 09:05:59

+0

您的通用代码应允许用户将任何(有效)数据插入到数据库中。如果你需要额外的过滤,那么你应该在单独的验证阶段进行,而不是在数据库中输入。 – Quamis 2010-09-11 09:33:08

+0

@Quamis我想这就是我正在做的,我先过滤代码,然后将它传递给数据库,我从来没有将它直接传递给数据库。纠正我,如果我错了。 – 2010-09-11 09:47:56

2

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

如果你只是在网页上显示的用户数据,你应该利用htmlspecialchars()htmlentities()

至于你已经发布的代码。让我们分解它。

  • htmlspecialchars - 将html 字符转换为相应的实体。
  • strip_tags - 之前,DB进入 字符转义 - 删除HTML和PHP从代码
  • mysql_real_escape_string 标签。

所以,正如你所看到的,你使用的前两个功能看起来相当反效果。你正在将HTML字符转换成实体,但你也剥离了标签。

为了确保在数据库条目mysql_real_escape_string就足够了之前确保用户输入安全。或者正如我前面提到的那样,利用准备好的陈述。

+0

mysql_real_escape_string是不够的。 mysql_real_escape_string **加引号**将 – 2010-09-11 09:58:38

2

如果无法找到或创建与数据库的连接,则可能会致电mysql_real_escape_string

在我实际执行查询之前,我倾向于尽可能深地调用此类调用。它可能会使我的性能略微下降,但我不必担心会丢失更高的参数(就sql注入而言),并且我知道在那时我总是有一个有效的数据库连接。

我还对所有用户输入做的第一件事是在执行任何其他操作之前,通过带有FILTER_SANITIZE_SPECIAL_CHARS的filter_var运行它。

+0

没有什么可以杀死任何性能,但是你没有看到正确的理由将“在查询之前”进行转义。这不是因为这个贫穷世界的每个人都认为需要输入数据的转义。但对于SQL查询。所以,在查询之前就是唯一可能的地方。 – 2010-09-11 09:58:07

+0

啊,是的,我明白你要出去的是什么。感谢您指出不太明显的内容。 :) – 2010-09-11 14:20:51

2

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

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

至于htmlspecialchars/strip_tags,与SQL无关,它是HTML保护,而不是SQL。 并且使用它们都是多余的。其中只有一个就足够了。我更喜欢htmlspecialchars。