дезинфекция предварительно заполненной пользовательской формы ввода - PullRequest
1 голос
/ 23 декабря 2009

У меня есть форма, которая принимает ввод текста. Мне бы хотелось, чтобы он мог принимать такие символы, как & и; и> и <, которые являются полезными символами для данных, предоставляемых пользователем. Я хочу, чтобы пользователь, например, мог сказать </p>

Амперсанд (&) кодируется как & (и я вижу из предварительного просмотра, что я не могу даже сделать это здесь - это должно выглядеть Амперсанд (&) кодируется как & amp; но я должен был набрать amp; после амперсанда, чтобы заставить это выглядеть правильно.) (кстати, предварительный просмотр классный, но я не могу рассчитывать на то, что у пользователей включены сценарии)

Я анализирую данные, и если с ними возникает проблема, я представляю запись пользователя обратно пользователю в той же форме, предварительно заполненной в том же поле, для редактирования и повторной отправки.

Если я представляю необработанные данные, я рискую иметь враждебный ввод (такой как сценарии или HTML), выполняемый браузером. Тем не менее, если я отфильтрую его (например, через htmlspecialcharacters), то пользователь увидит (представление) введенного им символа (скажем, амперсанд), но когда он повторно отправит, он фактически отправит замена (в данном случае это выглядит как & amp;), которая, как оказалось, даже содержит амперсанд. Если с входными данными все еще есть проблема, они будут снова представлены для редактирования, и мы будем на другом уровне с глубокими заменами.

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

Полагаю, «вопрос, на который можно ответить», - «возможно ли это?»

Хосе

редактирование:

<?php
$var=$_GET["test2"];
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
 "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">

<title>Input Escape Test</title>
</head><body>
The php parser would store the following input:<br>
<?php echo $var ?>
<br>

<form method="get" action="test.php"><p>
  <label for "test2">Test - question five: <br>type in a character on the first line<br>and its HTML entity on the second line.
  <textarea name="test2" cols="50" rows="3"><?php echo  $var; ?></textarea><br/>
  <input type="submit"/>
</p></form>
</body></html>

приводит к форме, в которой пользователь пытается ответить на вопрос амперсант амперсанд а м р точка с запятой. ЕСЛИ это отклоняется (скажем, из-за других недопустимых символов), пользователю предоставляется обратный ввод, за исключением вырезанных символов. Тем не менее точка с запятой также убирается из поля зрения (хотя оно есть в источнике). Затем пользователь попытается добавить еще одну точку с запятой к отображаемому результату.

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

Наконец, довольный, пользователь снова нажимает на кнопку «Отправить», и точка с запятой, похоже, снова исчезает. Пользователь не знает, что его (представленный) ответ будет сохранен как.

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

Хосе

Ответы [ 2 ]

1 голос
/ 23 декабря 2009

Да, это возможно как в Javascript, так и в коде на стороне сервера. Поскольку вы сказали, что не будете считать пользователей, у которых включен javascript, я предполагаю, что вы хотите выполнить этот вид преобразования на стороне сервера? Вы просто позволяете пользователю отправлять данные формы с помощью запроса POST в код на стороне сервера, и там вы преобразуете каждое вхождение <,>, &, "и" в соответствующую форму объекта, когда записываете данные обратно на страницу ответа html Затем он будет отображаться в браузере в точности так, как он был введен пользователем.

Редактировать: Извините, я недостаточно внимательно прочитал ваш вопрос. Вы должны быть в состоянии использовать только один уровень экранирования, то есть написать & amp; для '&', а не & amp; Этот уровень будет удален, когда браузер проанализирует вашу страницу, и исчезнет из данных, когда он будет отправлен обратно в виде данных формы. Взгляните на сгенерированный HTML-код и постарайтесь выяснить, для чего вам нужен второй уровень побегов.

Edit2 в ответ на комментарии: Вот простая тестовая страница, которая работает как положено в IE 8.0 и Firefox. Когда вы нажмете кнопку отправки, вы увидите, что отправляется на сервер в адресной строке вашего браузера (% 26 - это просто URL-кодировка для &). Как вы можете видеть & amp; удаляется из значения, а также из данных, отправляемых на сервер.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
<title>Input Escape Test</title>
</head><body>
<form method="get" action=""><p>
  <input name="test1" type="text" size="30" value="hello &amp; test"/><br/>
  <textarea name="test2" cols="50" rows="3">hello &amp; test</textarea><br/>
  <input type="submit"/>
</p></form>
</body></html>
0 голосов
/ 23 декабря 2009

При отправке данных из PHP в браузер, в базу данных, где угодно, вы ДОЛЖНЫ изменить их представление на одно приемлемое для принимающей стороны.

В случае отправки материала в браузер вам необходим конвертер htmlentities:

print "<input type='text' name='inp' value='" . htmlentities($_POST['inp']) . "'>\n";

С

...