Возможно, самое тонкое изменение в версии из предыдущего раздела состоит в том, что для надежности в этой редакции сценария ответа (пример 15.23) функция cgi.escape вызывается также для обработки на- зва ний языков, а не только для фрагмента программного кода на этих языках. Этого не требовалось в сценарии languages2.py (пример 15.20), потому что названия языков в таблице выбора были нам известны. Хоть и маловероятно, но все же возможно, что некто передаст сценарию название языка, содержащее символ HTML. Например, следующий URL:
http://localhost/cgi—bin/languages2reply.py?language=a<b
вставляет символ < в параметр с названием языка (названием является a<b). При передаче такого параметра эта версия с помощью функции cgi.escape правильно преобразует < для использования в HTML-разметке ответа согласно обсуждавшимся выше стандартным соглашениям HTML. Ниже приводится текст сгенерированного ответа:
<TITLE>Languages</TITLE>
<H1>Syntax</H1><HR>
<H3>a<b</H3><P><PRE>
Sorry—I don’t know that language
</PRE></P><BR>
<HR>
В исходной версии, в примере 15.18, название языка не экранируется, поэтому последовательность символов <b будет интерпретироваться как тег HTML (в результате чего оставшаяся часть страницы может быть выведена полужирным шрифтом!). Как вы уже можете теперь судить, экранирование текста повсеместно используется в сценариях CGI — даже текст, который кажется вам безопасным, обычно должен преобразовываться в экранированные последовательности перед вставкой в разметку HTML ответа.
Фактически, так как Веб является преимущественно текстовой средой, объединяющей множество языков программирования, к текстам могут применяться множество различных правил форматирования: одни для адресов URL и другие для разметки HTML. Выше в этой главе мы уже сталкивались с экранированием разметки HTML, теперь необходимо сказать несколько дополнительных слов об экранировании адресов URL и комбинации HTML и URL.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011