【问题标题】:When and how to encode/decode HTML when interacting with a database?与数据库交互时何时以及如何编码/解码 HTML?
【发布时间】:2017-05-05 20:45:43
【问题描述】:

我有一个在 PHP 和 MySQL 数据库上运行的网站。我想知道如何最好地处理有关 HTML 编码的用户输入(我很清楚我应该存储为接收到的并在输出中解码:这就是我所做的),尤其是这个循环:

  • 用户注册用用户名字段填写表单,该字段的内容经过验证并发送并存储在数据库中按原样(无 HTML 编码),因为它需要输出 HTML 、XML、JSON、明文等格式;
  • 在需要显示用户名的任何页面上,将从数据库中获取用户名,进行 HTML 编码并显示在页面中;
  • 在特定页面上,用户名放置在 html 文本输入的“值”字段中:显然这意味着用户名必须是 HTML 编码的(否则 XSS 和所有那些奇妙的东西......)。但是,这也意味着如果原始用户名是“però”,则文本字段将为 <input value="però">,当用户提交时,服务器将收到 però 而不是 però

现在我的问题是:服务器是否应该解码所有接收到的输入,以便 però 被解码为原始的 però
我怀疑这意味着如果用户输入è 作为他的用户名,它将被注册为è 而不是他的实际意图......

我知道这不是什么大问题(不知道有多少用户想在他们的用户名中使用 HTML 特殊字符编码文字......),但这让我感到困惑,我找不到完全令人满意的解决方案。

【问题讨论】:

  • 按提交存储。逃避输出,并逃避总是,除非有一个非常好的理由。您的转义可能有一个错误 - 您总是希望原始的、提交的数据可用。
  • However this also means that if the original usenrame was "però" the text field will be <input value="però"> and when the user submits it the server will receive però instead of però 这不是真的。
  • @SLaks 你能详细说明一下吗?
  • 不,在存储之前不要对它做任何事情。如果他们提交 HTML 并且您接受,请存储 HTML。
  • @Bonvi Ulrik 不正确。您将原始 HTML 存储在数据库中。您在 输出 上对其进行清理/转义。每个主要框架都将具有使这变得容易的功能。

标签: php html sql database html-encode


【解决方案1】:

除非我误解了您的要求,否则您似乎对将 HTML 编码字符串输出到文本输入的效果有错误的印象。这是将要发生的事情的基本示例。假设您有一个想要命名为PB&J 的用户。当然,这很奇怪,但并不是每个人都能选择一个不错的、不奇怪的用户名,比如“Bonvi”或“Don't Panic”。

所以您将其保存在数据库中原样。

稍后,当您以另一种形式使用它时,您将其转义以输出。

<input type="text" name="username" value="<?= htmlspecialchars($username) ?>">

在您的页面来源中,您会看到

<input type="text" name="username" value="PB&amp;amp;J">

将 & 符号转换为 HTML 实体。 (这是你想要的,以防他们真的想被命名为 bob"&gt;&lt;script&gt;alert("però!")&lt;/script&gt;&lt;p class="ha 或更糟的名字。)

但是文本框中显示的值会是PB&amp;amp;amp;J,而当用户提交表单时,$_POST['username']中的值会是PB&amp;amp;amp;J不是PB&amp;amp;amp;J不会更改为编码值。

(我在这个例子中使用了htmlspecialchars,但同样适用于你使用però和htmlentities的例子。)

我基本上是想解释一下,所以如果我误会了你,我深表歉意——我不想听起来居高临下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2011-05-19
    • 2019-07-12
    相关资源
    最近更新 更多