Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 与数据库交互时,何时以及如何编码/解码HTML?_Php_Html_Sql_Database_Html Encode - Fatal编程技术网

Php 与数据库交互时,何时以及如何编码/解码HTML?

Php 与数据库交互时,何时以及如何编码/解码HTML?,php,html,sql,database,html-encode,Php,Html,Sql,Database,Html Encode,我有一个在PHP和MySQL数据库上运行的网站。我想知道如何最好地处理HTML编码方面的用户输入(我很清楚,我应该存储为接收并在输出中解码:这就是我所做的),尤其是这个循环: 用户注册使用用户名字段填写表单,验证并发送字段内容,并按原样存储在DB中(无HTML编码),因为需要输出HTML、XML、JSON、明文和其他格式 在任何需要显示用户名的页面上,都将从数据库中提取用户名,进行HTML编码并显示在页面中 在特定页面上,用户名被放置在html文本输入的“值”字段中:显然,这意味着用户名必须是

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

  • 用户注册使用用户名字段填写表单,验证并发送字段内容,并按原样存储在DB中(无HTML编码),因为需要输出HTML、XML、JSON、明文和其他格式
  • 在任何需要显示用户名的页面上,都将从数据库中提取用户名,进行HTML编码并显示在页面中
  • 在特定页面上,用户名被放置在html文本输入的“值”字段中:显然,这意味着用户名必须是html编码的(否则XSS和所有这些奇妙的东西…)。但是,这也意味着,如果原始用户名为“però”,则文本字段将为
    ,当用户提交时,服务器将收到
    però而不是
    però
现在我的问题是:服务器是否应该解码所有接收到的输入,以便
però被解码为原始的
però

我怀疑这意味着如果用户输入
è
作为他的用户名,它将被注册为
è
,而不是他实际想要的


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

除非我误解了你的要求,您似乎对将HTML编码的字符串输出到文本输入的效果有错误的印象。这里有一个基本的例子说明将会发生什么。假设您有一个用户希望被命名为
PB&;J
。当然,这很奇怪,但不是每个人都能选择一个好的非奇怪的用户名,比如“Bonvi”或“不要惊慌”

因此,您可以按原样将其保存在数据库中

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

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

存储为已提交。为了输出而逃逸,除非有非常好的理由,否则永远逃逸。您的转义可能有一个错误-您总是想要原始数据,因为提交的数据可用。
但是这也意味着,如果原始UsenName为“però”,则文本字段将为,并且当用户提交时,服务器将收到però;而不是però
这是不正确的。@SLaks请详细说明一下好吗?不,在存储之前不要对它做任何事情。如果他们提交HTML,而您接受,请存储HTML。@Bonvi Ulrik不正确。将原始HTML存储在数据库中。在输出时对其进行清理/转义。每一个主要的框架都会有一些功能来简化这个过程。谢谢你,你做到了!这正是我想知道的:我做了一些测试,但不知何故,我得到了一个错误的印象,即输入包含html编码将以编码的形式发送它们。。。再次感谢你!
<input type="text" name="username" value="PB&amp;amp;J">