5

我对某事感到非常困惑,想知道是否有人可以解释。

在 PHP 中,我验证了用户输入,因此 htmlentitiies,mysql_real_escape_string 在插入数据库之前使用,而不是在所有内容上,因为我更喜欢使用正则表达式,尽管我发现它们很难使用。现在显然我将使用 mysql_real_escape_string 作为数据进入数据库,但不确定我是否应该仅在从数据库获取数据并将其显示在网页上时才使用 htmlentities(),因为这样做之前会改变一个人输入的数据没有保留它的原始形式,如果我以后想将该数据用于其他用途,这可能会导致问题。

例如,我有一个包含 3 个字段名称、主题和消息的留言簿。现在显然这些字段可以包含任何东西,比如 js 标签中的恶意代码基本上任何东西,现在让我感到困惑的是,假设我是一个恶意的人,我决定使用 js 标签和一些恶意 js 代码并提交表单,现在基本上我有恶意我的数据库中的无用数据。现在通过在将恶意代码输出到网页(留言簿)时使用 htmlentities 这不是问题,因为 htmlentities 已将其转换为安全的等价物,但同时我在数据库中有我宁愿没有的无用恶意代码。

因此,在说了所有这些之后,我的问题是我是否应该接受数据库中的某些数据可能是恶意的、无用的数据的事实,并且只要我在输出上使用 htmlentities 一切都会好起来的,还是我应该做其他事情呢?

我读了很多书,说在接收数据时过滤数据并在输出数据时对其进行转义,以便保留原始表单,但他们只给出示例,例如确保字段只是使用 php 等内置函数的 int,但我从未找到关于确保您希望用户键入他们想要的任何内容的留言簿之类的任何内容,以及如何将这些数据与 mysql_real_escape_string() 分开以确保它不会破坏数据库查询?

有人可以最终为我解决这个困惑并告诉我我应该做什么以及最佳实践是什么?

感谢任何可以解释的人。

干杯!

4

3 回答 3

2

这是一个很长的问题,但我认为您实际上要问的问题归结为:

“我应该在将 HTML 插入我的数据库之前,还是在显示它时转义它?”

这个问题的普遍接受的答案是,htmlspecialchars当您向用户显示 HTML 时,应该转义 HTML(通过 ),而不是在将其放入数据库之前。

原因是这样的:数据库存储数据。您输入的是用户输入的内容。当您调用 时mysql_real_escape_string,它不会改变插入数据库的内容;它只是避免将用户的输入解释为 SQL 语句。 htmlspecialchars对 HTML 做同样的事情;当您打印用户的输入时,它将避免将其解释为 HTML。如果你在插入之前打电话htmlspecialchars,你就不再是忠实的了。

您应该始终努力获得可以获得的最大保真度表示。由于将“恶意”代码存储在数据库中并没有什么害处(事实上,它为您节省了一些空间,因为转义的 HTML 比未转义的要长!),并且您将来可能需要该 HTML(如果您使用 XML 解析器呢?在用户评论上,或者有一天让受信任的用户在他们的评论中包含 HTML 的子集,或者类似的?),为什么不让它呢?

您还询问了其他类型的输入验证(整数约束等)。您的数据库模式应该强制执行这些,并且它们也可以在应用程序层检查(最好通过 JS 输入,然后再通过服务器端)。

另一方面,使用 PHP 进行数据库转义的最佳方法可能是使用 PDO,而不是mysql_real_escape_string直接调用。PDO 具有更高级的功能,包括类型检查。

于 2010-09-03T18:39:31.240 回答
1

mysql_real_escape_string()是数据库操作所需的一切。它将确保恶意用户无法将某些内容嵌入到会“破坏”您的查询的数据中。

htmlentities()htmlspecialchars()在您向客户端/浏览器发送内容时发挥作用。如果你想清理潜在的恶意 HTML,你最好使用HTMLPurifier,它将数据剥离到基岩并用漂白剂冲洗并正确重建它。

于 2010-09-03T18:36:50.450 回答
0

如果您在 HTML 出现时对其进行转义,则无需担心数据库中存在恶意 JavaScript 代码。只要确保你总是逃避从数据库中出来的任何东西。

于 2010-09-03T18:41:04.050 回答