Не избегайте специальных символов при отправке формы - PullRequest
3 голосов
/ 17 августа 2011

У меня есть форма, которая отправляется через GET, и одно из скрытых полей представляет список идентификаторов категорий, разделенных запятой (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>

Ответы [ 4 ]

1 голос
/ 17 августа 2011

Использовать Javascript для ручного кодирования строки запроса? Немного некрасиво, но похоже, что это единственный вариант.

0 голосов
/ 17 августа 2011

Проблема с «остановкой» заключается в том, что кодирование является частью стандартов HTTP - вам не следует «останавливать» его, поскольку оно является частью самой основы, на которой построен HTTP. RFC2396 описывает, какие символы разрешены и запрещены в URI:

2.2.Зарезервированные символы

Многие URI включают компоненты, состоящие из определенных специальных символов или разделенные ими.Эти символы называются «зарезервированными», поскольку
их использование в компоненте URI ограничено их зарезервированным
назначением.Если данные для компонента URI будут конфликтовать с зарезервированной целью
, то конфликтующие данные должны быть экранированы до
формирования URI.

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

Из-за этого факта, когдаиспользуя GET для отправки формы, пользовательский агент закодирует значения в соответствии с этой спецификацией.

Ваше решение заключается либо в

1) Измените форму, чтобы использовать метод POST, измените ссылки на$_GET в $_POST в php

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 голосов
/ 17 августа 2011

Вместо предотвращения кодирования рассмотрите возможность декодирования строки при ее получении.Вот пример (с использованием 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]]>"/>

0 голосов
/ 17 августа 2011

Создайте 3 скрытых поля с тем же именем «категория» и разными значениями 1, 2 и 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...