【发布时间】:2017-05-05 20:45:43
【问题描述】:
我有一个在 PHP 和 MySQL 数据库上运行的网站。我想知道如何最好地处理有关 HTML 编码的用户输入(我很清楚我应该存储为接收到的并在输出中解码:这就是我所做的),尤其是这个循环:
- 用户注册用用户名字段填写表单,该字段的内容经过验证并发送并存储在数据库中按原样(无 HTML 编码),因为它需要输出 HTML 、XML、JSON、明文等格式;
- 在需要显示用户名的任何页面上,将从数据库中获取用户名,进行 HTML 编码并显示在页面中;
- 在特定页面上,用户名放置在 html 文本输入的“值”字段中:显然这意味着用户名必须是 HTML 编码的(否则 XSS 和所有那些奇妙的东西......)。但是,这也意味着如果原始用户名是“però”,则文本字段将为
<input value="per&ograve;">,当用户提交时,服务器将收到per&ograve;而不是però。
现在我的问题是:服务器是否应该解码所有接收到的输入,以便 per&ograve; 被解码为原始的 però?
我怀疑这意味着如果用户输入&egrave; 作为他的用户名,它将被注册为è 而不是他的实际意图......
我知道这不是什么大问题(不知道有多少用户想在他们的用户名中使用 HTML 特殊字符编码文字......),但这让我感到困惑,我找不到完全令人满意的解决方案。
【问题讨论】:
-
按提交存储。逃避输出,并逃避总是,除非有一个非常好的理由。您的转义可能有一个错误 - 您总是希望原始的、提交的数据可用。
-
However this also means that if the original usenrame was "però" the text field will be <input value="per&ograve;"> and when the user submits it the server will receive per&ograve; instead of però这不是真的。 -
@SLaks 你能详细说明一下吗?
-
不,在存储之前不要对它做任何事情。如果他们提交 HTML 并且您接受,请存储 HTML。
-
@Bonvi Ulrik 不正确。您将原始 HTML 存储在数据库中。您在 输出 上对其进行清理/转义。每个主要框架都将具有使这变得容易的功能。
标签: php html sql database html-encode