Передача странного текста в качестве переменных с помощью метода post в php - PullRequest
0 голосов
/ 09 июня 2009

У меня странная проблема. Наша компания собирает данные, и мы используем УЖАСНОЕ программное обеспечение для проведения всех наших телефонных интервью. Он использует двоичные файлы вместо SQL и не использует сжатие. На данный момент мы должны вручную запускать все отчеты для клиентов. Я работаю над созданием веб-интерфейса для наших данных и общих отчетов.

Теперь мне нужно передать то, что называется «оператор выбора» из Интернета, на сервер, и я делаю это с помощью метода php post. Проблема в том, что веб-браузерам не нравятся некоторые символы, которые должны использоваться в операторах выбора. Я попытался кодировать их, но затем браузеры автоматически расшифровывают их обратно в обычный текст, когда они являются гиперссылками.

Вот несколько примеров операторов выбора.

[3023.2#1] 
[3023.2$] = "1"
[3023.2<>1]
[500.10$] = "Name"

И URL будет выглядеть примерно так:

CustomReport.php?type=1&select="[3023.2#1]"

У меня проблема в том, что различные операторы выбора ломают сайт в зависимости от используемых кавычек. select = [3023.2 <> 1] не работает, но select = "[3023.2 <> 1]" работает. НО, если я выберу = = [3023.2 # 1], он будет работать, а использование кавычек сломает его. И когда он ломается, ни панель инструментов WebDev, ни FireBug не сообщают о каких-либо ошибках, но очевидно, что мои DIV все испорчены.

Я должен также добавить, что нигде нет оператора select, отображаемого на сайте, он используется только в php как часть команды exec, поэтому я действительно не понимаю, почему это нарушает мой сайт.

/ Конец каната
// Возможно, что-то глупое

Ответы [ 6 ]

3 голосов
/ 10 июня 2009

Вы хотите изучить rawurlencode и htmlentities . Они должны вам безмерно помочь.

В сторону: ДОЛЖНО быть учтено замечание анонима об осторожной передаче исполняемых команд через URL. Похоже, что ваше приложение не находится в общедоступной сети, но если это так, вам нужно помнить о проблемах безопасности, связанных с этим.

<?php 

$select_statements = array(
    '[3023.2#1]',
    '[3023.2$] = "1"',
    '[3023.2<>1]',
    '[500.10$] = "Name"',
);

foreach ($select_statements as $ss) {
    print htmlentities($ss);
    print "<br>";
    $url = $_SERVER['PHP_SELF'] . "?type=1&amp;select=" . rawurlencode($ss);
    print "<a href=\"{$url}\">{$url}</a>";  
    print "<br>";
    print "<br>";
}

print htmlentities($_GET['select']);

?>

Результаты (для меня):

[3023,2 # 1] /CustomReport.php?type=1&select=%5B3023.2%231%5D

[3023.2 $] = "1" /CustomReport.php?type=1&select=%5B3023.2%24%5D%20%3D%20%221%22

[3023,2 <> 1] /CustomReport.php?type=1&select=%5B3023.2%3C%3E1%5D

[500.10 $] = "Имя" /CustomReport.php?type=1&select=%5B500.10%24%5D%20%3D%20%22Name%22

И если я нажму на ссылку, я также увижу любой выбранный мной вариант. Конечно, правильно вставлять в html-объекты.

1 голос
/ 09 июня 2009

А вы пробовали url-кодирование только выделенной части?

$queryString = 'select=' . urlencode($select);
0 голосов
/ 10 июня 2009

Почему вы используете значения в графическом интерфейсе для непосредственного построения оператора запроса? Все эти «запросы» должны быть скрыты на сервере в карте для нормальных значений и только за исключением нормальных значений из веб-клиента:

 $queries = Array(
       'meaningfulname1' => '[3023.2#1]',
       'meaningfulname2' => '[3023.2$] = "1"',
       'meaningfulname3' => '[3023.2<>1]',
       'meaningfulname4' => '[500.10$] = "Name"',
 );

Тогда ваш URL просто

 CustomReport.php?type=1&select=meaningfulname1

Теперь вы можете легко перевести «sensefulname1» в правильную последовательность кода, необходимую для вашего программного обеспечения, и вы не подвергаете браузер безумному бэкэнду. Это также означает, что если вы как-то исправите свой бэкэнд, чтобы использовать какой-то другой язык запросов (например, SQL), вам не нужно перекодировать слой GUI. Он по-прежнему запрашивает значимое имя1.

0 голосов
/ 09 июня 2009

Вы также можете отказаться от использования POST. Вместо этого сохраните оператор в переменной сеанса, базе данных или временном файле, а затем извлеките его для обработки на следующей странице.

Если вы используете базу данных, используйте текстовое поле двоичного типа с кодировкой utf8, которое должно позволять вам обрабатывать странные символы.

0 голосов
/ 09 июня 2009

Попробуйте использовать функции urlencode / urldecode в выбранных строках. Это должно правильно закодировать все странные символы.

также будьте осторожны с командой exec. Это удобно, но опасно.

0 голосов
/ 09 июня 2009

Для каждого из параметров вы должны использовать urlencode для экранирования символов:

$select = urlencode("[3023.2#1]");

через http://us2.php.net/urlencode

...