Экранирование адресов URL

ekranirovanie adresov url Сценарии на стороне сервера

В адресах URL используются иные специальные символы и иные соглашения по их экранированию. По этой причине для экранирования адресов URL применяются другие библиотечные инструменты Python. Модуль Python urllib.parse предоставляет два инструмента, осуществляющие преобразование: функцию quote, возвращающую стандартные шестнадцатеричные экранированные последовательности %XX URL для большинства не алфавитно-цифровых символов, и функцию quote_plus, для преобразования пробелов в символы +. Кроме того, модуль urllib. parse предоставляет функции для обратного преобразования экранированных последовательностей в адресах URL: функция unquote преобразует последовательности %XX, а функция unquote_plus также преобразует символы + в пробелы. Ниже приводится пример использования модуля в интерактивной оболочке:

>>> import urllib.parse

>>> urllib.parse.quote("a & b #! c") ‘a%20%26%20b%20%23%21%20c’

>>> urllib.parse.quote_plus("C:\stuff\spam.txt") ‘C%3A%5Cstuff%5Cspam.txt’

>>> x = urllib.parse.quote_plus("a & b #! c")

>>> x

‘a+%26+b+%23%21+c’

>>> urllib.parse.unquote_plus(x) ‘a & b #! c’

Экранированные последовательности URL помещают шестнадцатеричные значения небезопасных символов вслед за знаком % (обычно это их ASCII-коды). В urllib.parse небезопасными символами обычно считаются все кроме букв, цифр и некоторых безопасных специальных символов (символов ‘_.-‘), но эти два инструмента по-разному интерпретируют символы слэша, а кроме того, имеется возможность расширить набор безопасных символов, передав функции quote дополнительный строковый аргумент:

>>> urllib.parse.quote_plus("uploads/index.txt")

‘uploads%2Findex.txt’

>>> urllib.parse.quote("uploads/index.txt") ‘uploads/index.txt’

>>> 

>>> urllib.parse.quote_plus("uploads/index.txt", ‘/’) ‘uploads/index.txt’

>>> urllib.parse.quote("uploads/index.txt", ‘/’)

‘uploads/index.txt’

>>> urllib.parse.quote("uploads/index.txt", »)

‘uploads%2Findex.txt’

>>> 

>>> urllib.parse.quote_plus("uploads\index.txt")

‘uploads%5Cindex.txt’

>>> urllib.parse.quote("uploads\index.txt")

‘uploads%5Cindex.txt’

>>> urllib.parse.quote_plus("uploads\index.txt", ‘\\’) ‘uploads\\index.txt’

Обратите внимание, что модуль Python cgi в процессе извлечения входных данных также преобразует экранированные последовательности URL обратно в их исходные символы и меняет знаки + на пробелы. Внутренне конструктор cgi.FieldStorage при необходимости автоматически вызывает инструменты urllib.parse для обратного преобразования параметров, передаваемых в конце адреса URL. В итоге сценарии CGI получают исходные, неэкранированные строки URL, и им не требуется самостоятельно производить обратное преобразование значений. Как мы видели, сценариям CGI вообще не требуется знать, что входные данные поступили из URL.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий