【问题标题】:Do not escape special characters on form submit不要在表单提交时转义特殊字符
【发布时间】:2011-08-17 15:32:39
【问题描述】:

我有一个通过 GET 提交的表单,其中一个隐藏字段提交了一个类别 ID 列表,以逗号 (1,2,3) 分隔。

当 get 查询到达它要去的页面时,逗号变成%2C 转义。

我无法对解析这些值的 PHP 进行更改,它们必须保留逗号。

总而言之:?category=1,2,3 有效,?category=1%2C2%2C3 无效。

如何防止逗号被编码?

编辑以解决评论,简化,但为您提供要点:

<form method="get" action="something.php">
<input type="hidden" name="category" value="1,2,3">
<input type="submit">
</form>

【问题讨论】:

  • 你是如何形成查询的,提交是如何完成的?
  • 不能使用post,web服务只需要GET。
  • 网络服务写得不好。更改为表单标记的 onsubmit 方法以创建您的查询字符串和 window.open 或 window.location.href 它。

标签: php html forms escaping


【解决方案1】:

“让它停止”的问题在于编码是 HTTP 标准的一部分——你“不应该”让它停止,因为它是构建 HTTP 的基础的一部分。 RFC2396 描述了 URI 中允许和不允许的字符:

2.2。保留字符

许多 URI 包括由某些组成或分隔的组件 特殊的角色。这些字符被称为“保留”,因为
它们在 URI 组件中的使用仅限于它们的保留
目的。如果 URI 组件的数据与
保留用途,则冲突数据必须先转义
形成 URI。

  reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                "$" | ","

因此,当使用 GET 提交表单时,用户代理将根据此规范对值进行编码。

您的解决方案在于任一

  1. 更改表单使用POST方法,将php中对$_GET的引用更改为$_POST

  2. 在使用数据之前调用 urldecode (docs) ($_GET['my_value'] = urldecode($_GET['my_value']);)

  3. 使用元素数组将其作为数组提交给服务器

在 PHP 方面,$_GET['myElement'] 将等于 array(1,2,3)

【讨论】:

    【解决方案2】:

    使用Javascript手动编码查询字符串?有点难看,不过好像是唯一的选择。

    【讨论】:

      【解决方案3】:

      创建 3 个具有相同名称“类别”和不同值 1、2 和 3 的隐藏字段。

      【讨论】:

      • 我试过了,结果是:?category=1&category=2&category=3
      【解决方案4】:

      不要阻止编码,而是考虑在收到字符串时对其进行解码。这是一个例子(使用java):

      公共类编码
      {
          公共静态无效主要(字符串 [] 参数)
          {
              字符串编码值;
              字符串值 = "a, b, c";
              字符串未编码值;
      
              尝试
              {
                  encodeValue = URLEncoder.encode(value, "UTF-8");
              }
              捕获(UnsupportedEncodingException 异常)
              {
                  编码值=空;
      
                  System.out.print("编码异常:");
                  System.out.println(exception.getMessage());
              }
      
              尝试
              {
                  unencodedValue = URLDecoder.decode(encodedValue, "UTF-8");
              }
              捕获(UnsupportedEncodingException 异常)
              {
                  未编码值 = 空;
                  System.out.print("解码异常:");
                  System.out.println(exception.getMessage());
              }
      
              System.out.print("原文:");
              System.out.println(值);
              System.out.print("编码:");
              System.out.println(encodedValue);
              System.out.print("解码:");
              System.out.println(unencodedValue);
          }
      }
      

      我刚刚注意到 php 标签。虽然我不了解 php,但我确信它可以对 HTML 字符串值进行编码和解码。

      编辑: 基于 cmets,尝试渲染隐藏在 CDATA 块内的值。我不知道这是否可行,只是把它扔在那里。这是一个例子:

      &lt;input type="hidden" name="blam" value="&lt;![CDATA[1, 2, 3]]&gt;"/&gt;

      【讨论】:

      • 谢谢,我考虑过,但遗憾的是,我无法对接收方进行修改。
      • 能否在页面渲染端进行修改?
      • 到那时为时已晚,因为为块提取数据的模型已经忽略了正在提交的类别列表。
      • “渲染方”是指提交给“不变”接收方的表单的渲染。
      猜你喜欢
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多