首页 文章

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

提问于
浏览
3

我有一个通过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

    "making it stop"的问题在于编码是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)

  • 0

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

  • 0

    创建3个具有相同名称“category”和不同值1,2和3的隐藏字段 .

  • 1

    不要阻止编码,请考虑在收到字符串时对其进行解码 . 这是一个例子(使用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字符串值 .

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

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

相关问题