【问题标题】:PHP encoding the POST inputPHP 编码 POST 输入
【发布时间】:2022-08-21 20:39:19
【问题描述】:

我有一个 PHP 代码,如下所示,在 POST 调用中,我得到的是加密值而不是字符。例如,输入Hello World\' 我得到这个Hello World'而不是控制台(from Line Z) 上的Hello World\'

form_validator.php 中,我使用以下内容:

if (isset($_POST[\"response\"]))
    $response = $_POST[\"response\"];
print_r($response);

form.php 中,我有以下代码:

<form id=\"acbdef\" name=\"abcdef\" action=\"#\" method=\"post\">
  <table width=\"100%\" class=\"wb-tables table\">
    <tr>
      <td>
        <?php echo SECRET_RESPONSE;?>:
      </td>
      <td colspan=\"2\"><input type=\"text\" id=\"response\" name=\"response\" value=\"\" /></td>
    </tr>
  </table>
</form>

<script>
  // Test all the fields in another php page using javax and receive the result by JSON
  $(\"#save\").click(function () {
    $.post(\'form_validator.php\', $(\"#abcdef\").serialize(), function (data) {
      console.log(data); // Line Z
    });// end function(data)
  });
</script>

config.php 中,我有以下内容:

$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
$_REQUEST = (array) $_POST + (array) $_GET + (array) $_REQUEST;

问题陈述 :

我想知道我需要在上面的 php 代码中进行哪些更改,以便使用 character itself 而不是 HTML coded apostrophe

  • print_r 格式化结果,尝试使用 echo
  • 您可以尝试将包含表单的页面的编码设置为e。 G。 &lt;meta charset=\"utf-8\" /&gt;。恕我直言,这应该告诉 jquery post 函数正确编码。
  • 你看过html_entity_decode()htmlspecialchars_decode()吗?
  • 我根本无法重现这一点。 jQuery doesn\'t transform the request dataPHP doesn\'t encode the response,无论您使用 print_r 还是 echo。您的特定设置必须涉及其他内容
  • @Phil 我已包含 config.php 文件。让我知道这是否有帮助。

标签: php html jquery html-encode


【解决方案1】:

问题出在您的config.php 中,您有以下行:

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

这将对输入中的单引号和双引号进行 HTML 编码,如章节 Sanitize filters 中所定义:

FILTER_SANITIZE_STRING

剥离标签和 HTML 编码双引号和单引号,可选择剥离或编码特殊字符。可以通过设置FILTER_FLAG_NO_ENCODE_QUOTES 禁用编码引号。 (自 PHP 8.1.0 起已弃用,请改用 htmlspecialchars()。)

如果您不想在其各自的 HTML 编码字符串中转换任何单引号或双引号,则使用标志 FILTER_FLAG_NO_ENCODE_QUOTES 或不要使用 FILTER_SANITIZE_STRING 过滤器(无论如何它已被弃用)。

【讨论】:

    【解决方案2】:

    @Progman 的答案是如何解决您的配置问题。

    我想确保更好地理解原因。

    您的字符串在技术上并未加密,而是经过编码,已转换为 HTML“安全”等价物——使用 HTML 实体。您可以在此处阅读更多相关信息https://developer.mozilla.org/en-US/docs/Glossary/Entity

    但本质上,' 已被转换为 HTML 实体代码 '。这个想法是,嵌入 HTML 文档已经变得安全,它本身不会被解释为 HTML,而只是简单的文本。

    这是一个与转义字符串非常相似的概念,仅适用于 HTML 文档和 Web 浏览器。

    所有 HTML 实体都可以表示为文字或其实体代码。在这种情况下,' 可以写成 '&amp;#39

    【讨论】:

      【解决方案3】:

      您似乎正在序列化输入。在您将它发送到您的 php.ini 之前,在 jquery 中。您需要在打印之前对其进行解码。

      查看https://www.php.net/manual/en/function.html-entity-decode 作为开始的地方

      【讨论】:

      • api.jquery.com/serialize 明确用于创建“标准 URL 编码表示法的文本字符串”,即确切地你想要一个正常的application/x-www-form-urlencoded 数据提交。
      猜你喜欢
      • 2013-10-03
      • 2018-06-27
      • 2019-10-02
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 2017-01-10
      相关资源
      最近更新 更多