何时以及如何在与数据库交互时 encode/decode HTML?
When and how to encode/decode HTML when interacting with a database?
我有一个在 PHP 上运行的网站和一个 MySQL 数据库。我想知道如何最好地处理关于 HTML 编码的用户输入(我很清楚我应该按接收到的形式存储并在输出中解码:这就是我所做的),尤其是这个周期:
- 用户注册填写带有用户名字段的表单,该字段的内容被验证并发送并存储在数据库中原样(无HTML编码)因为会要求输出HTML、XML、JSON、明文等格式;
- 在任何需要显示用户名的页面上,将从数据库中提取用户名,HTML-编码并显示在页面中;
- 在特定页面上,用户名被放置在 html 文本输入的 "value" 字段中:显然这意味着用户名必须经过 HTML 编码(否则 XSS 和所有那些奇妙的东西......)。然而,这也意味着如果原始用户名是 "però",文本字段将是
<input value="però">
,当用户提交它时,服务器将收到 però
而不是 però
。
现在我的问题是:服务器是否应该解码所有接收到的输入,以便 però
被解码为原始的 però
?
我怀疑这是否意味着如果用户输入 è
作为他的用户名,它将被注册为 è
而不是他实际想要的...
我知道这不是什么大问题(不知道有多少用户想在用户名中使用 HTML 特殊字符编码文字...),但我和我都感到困惑找不到完全满意的解决方案。
除非我误解了你的问题,否则你似乎对将 HTML 编码字符串输出到文本输入的效果有错误的印象。这是将要发生的事情的一个基本示例。假设您有一个用户想被命名为 PB&J
。当然,这很奇怪,但并不是每个人都能选择一个不错的非奇怪用户名,例如 "Bonvi" 或 "Don't Panic".
因此您将其保存在数据库中 原样。
稍后,当您以另一种形式使用它时,您可以将其转义以进行输出。
<input type="text" name="username" value="<?= htmlspecialchars($username) ?>">
在您的页面 source 中,您会看到
<input type="text" name="username" value="PB&amp;J">
与符号转换为 HTML 实体。 (这是你想要的,以防他们真的想被命名为 bob"><script>alert("però!")</script><p class="ha
或更糟的名字。)
但是文本框中显示的值会是PB&J
,当用户提交表单时,$_POST['username']
中的值会是PB&J
,不是PB&amp;J
。 不会改成编码后的值
(我在这个例子中使用了 htmlspecialchars
,但是这同样适用于你使用 però 和 htmlentities
的例子。)
我只是想从根本上解释它,所以如果我误解了你,我深表歉意 - 我不想听起来居高临下。
我有一个在 PHP 上运行的网站和一个 MySQL 数据库。我想知道如何最好地处理关于 HTML 编码的用户输入(我很清楚我应该按接收到的形式存储并在输出中解码:这就是我所做的),尤其是这个周期:
- 用户注册填写带有用户名字段的表单,该字段的内容被验证并发送并存储在数据库中原样(无HTML编码)因为会要求输出HTML、XML、JSON、明文等格式;
- 在任何需要显示用户名的页面上,将从数据库中提取用户名,HTML-编码并显示在页面中;
- 在特定页面上,用户名被放置在 html 文本输入的 "value" 字段中:显然这意味着用户名必须经过 HTML 编码(否则 XSS 和所有那些奇妙的东西......)。然而,这也意味着如果原始用户名是 "però",文本字段将是
<input value="però">
,当用户提交它时,服务器将收到però
而不是però
。
现在我的问题是:服务器是否应该解码所有接收到的输入,以便 però
被解码为原始的 però
?
我怀疑这是否意味着如果用户输入 è
作为他的用户名,它将被注册为 è
而不是他实际想要的...
我知道这不是什么大问题(不知道有多少用户想在用户名中使用 HTML 特殊字符编码文字...),但我和我都感到困惑找不到完全满意的解决方案。
除非我误解了你的问题,否则你似乎对将 HTML 编码字符串输出到文本输入的效果有错误的印象。这是将要发生的事情的一个基本示例。假设您有一个用户想被命名为 PB&J
。当然,这很奇怪,但并不是每个人都能选择一个不错的非奇怪用户名,例如 "Bonvi" 或 "Don't Panic".
因此您将其保存在数据库中 原样。
稍后,当您以另一种形式使用它时,您可以将其转义以进行输出。
<input type="text" name="username" value="<?= htmlspecialchars($username) ?>">
在您的页面 source 中,您会看到
<input type="text" name="username" value="PB&amp;J">
与符号转换为 HTML 实体。 (这是你想要的,以防他们真的想被命名为 bob"><script>alert("però!")</script><p class="ha
或更糟的名字。)
但是文本框中显示的值会是PB&J
,当用户提交表单时,$_POST['username']
中的值会是PB&J
,不是PB&amp;J
。 不会改成编码后的值
(我在这个例子中使用了 htmlspecialchars
,但是这同样适用于你使用 però 和 htmlentities
的例子。)
我只是想从根本上解释它,所以如果我误解了你,我深表歉意 - 我不想听起来居高临下。