不要在表单提交时转义特殊字符

时间:2011-08-17 15:32:40

标签: php html forms escaping

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

当获取查询到达页面时,逗号将被%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>

4 个答案:

答案 0 :(得分:1)

使用Javascript手动编码查询字符串?有点难看,但看起来它是唯一的选择。

答案 1 :(得分:0)

创建3个隐藏字段,其名称为“category”,值为1,2和3。

答案 2 :(得分:0)

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

public class Encoden
{
    public static void main(String[] args)
    {
        String encodedValue;
        String value = "a, b, c";
        String unencodedValue;

        try
        {
            encodedValue = URLEncoder.encode(value, "UTF-8");
        }
        catch (UnsupportedEncodingException exception)
        {
            encodedValue = null;

            System.out.print("encoding exception: ");
            System.out.println(exception.getMessage());
        }

        try
        {
            unencodedValue = URLDecoder.decode(encodedValue, "UTF-8");
        }
        catch (UnsupportedEncodingException exception)
        {
            unencodedValue = null;
            System.out.print("decoding exception: ");
            System.out.println(exception.getMessage());
        }

        System.out.print("Original: ");
        System.out.println(value);
        System.out.print("Encoded: ");
        System.out.println(encodedValue);
        System.out.print("Decoded: ");
        System.out.println(unencodedValue);
    }
}

我刚注意到了php标签。虽然我不知道php,但我确信它将有一种方法来编码和解码HTML字符串值。

修改 根据注释,尝试渲染CDATA块中隐藏的值。我不知道这是否会奏效,只是把它扔出去。这是一个例子:

<input type="hidden" name="blam" value="<![CDATA[1, 2, 3]]>"/>

答案 3 :(得分:0)

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

  

2.2。保留字符

     

许多URI包含由某些组成或由其分隔的组件   特殊字符。这些字符称为“保留”,因为
  它们在URI组件中的使用仅限于它们的保留
  目的。如果URI组件的数据与
发生冲突   保留目的,然后必须在之前转义冲突的数据   形成URI。

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

由于这个事实,当使用GET提交表单时,用户代理将根据此规范对值进行编码。

您的解决方案在于

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

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

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

<input name="myElement[]" value="1" />
<input name="myElement[]" value="2" />
<input name="myElement[]" value="3" />

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