URL-кодирование: полное руководство
URL-кодирование (также называемое процентным кодированием) — это фундаментальный механизм, обеспечивающий надёжную работу интернета. Каждый раз, когда вы вводите URL с пробелами, специальными символами или не-ASCII символами, ваш браузер незаметно кодирует их в формат, который может безопасно передаваться через интернет. Это руководство объясняет всё, что вам нужно знать о URL-кодировании, от основ до продвинутых тем и вопросов безопасности.
Что такое URL-кодирование?
URL-кодирование — это метод преобразования символов в формат, который может быть передан через интернет. Символы, не являющиеся частью разрешённого набора символов URL, заменяются знаком процента (%), за которым следуют две шестнадцатеричные цифры, представляющие значение символа в ASCII. Например, пробел становится %20, а знак вопроса становится %3F.
URL могут содержать только ограниченный набор символов: буквы (A-Z, a-z), цифры (0-9) и несколько специальных символов (-, _, ., ~). Любой символ вне этого набора должен быть закодирован. Без кодирования такие символы, как пробелы, не-ASCII буквы и знаки препинания, нарушили бы синтаксис URL или были бы неправильно интерпретированы серверами.
Структура URL
URL-кодирование работает путём замены каждого небезопасного символа на %XX, где XX — это шестнадцатеричное представление байтового значения символа в UTF-8. Для символов, требующих нескольких байтов в UTF-8, каждый байт кодируется отдельно, что приводит к последовательности, подобной %D0%9F (для русского символа П).
URL-кодирование доступно во всех языках программирования и необходимо для корректной обработки пользовательского ввода в URL.
Почему необходимо URL-кодирование
HTML-формы имеют особую связь с URL-кодированием, поскольку данные формы кодируются в URL при отправке через GET или в теле запроса при отправке через POST.
- Пробелы: пробелы в URL должны быть закодированы как %20. В параметрах запроса форм они также могут отображаться как +, но %20 является более надёжным вариантом.
- Специальные символы: такие символы, как &, ?, = и #, имеют специальное значение в URL и должны быть закодированы, когда используются как данные, а не как синтаксис URL.
- Не-ASCII символы: символы за пределами основного набора ASCII должны быть закодированы в UTF-8, а затем закодированы в процентах. Например, русское слово привет кодируется как %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82.
Зарезервированные и незарезервированные символы
URL-кодирование является мощным инструментом, но его неправильное использование может привести к трудноотлаживаемым ошибкам. Вот самые распространённые ошибки, которых следует избегать:
Двойное кодирование происходит, когда уже закодированная строка кодируется снова. Например, если вы кодируете «hello world», вы получаете «hello%20world». Если вы закодируете это снова, вы получите «hello%2520world» (знак % кодируется как %25). Это распространённая ошибка, когда несколько слоёв приложения кодируют один и тот же URL.
Как работает URL-кодирование
URL-кодирование пересекается с безопасностью несколькими способами. Хотя это не функция безопасности, неправильное кодирование может создавать уязвимости.
| Символ | Кодированное значение | Примечания | Язык |
|---|---|---|---|
| Пробел | %20 | Самый распространённый закодированный символ | ! |
| %21 | Восклицательный знак | " | %22 |
| Двойная кавычка | # | %23 | Решётка (якорь) |
| $ | %24 | Знак доллара | % |
| %25 | Знак процента | & | %26 |
| Амперсанд (разделитель параметров) | + | %2B | Знак плюс |
| , | %2C | Запятая | / |
| %2F | Косая черта (разделитель пути) | : | %3A |
| Двоеточие | = | %3D | Знак равно (пара ключ-значение) |
| ? | %3F | Вопросительный знак (начало запроса) | @ |
| %40 | Знак at | JavaScript | encodeURIComponent() |
| decodeURIComponent() | Python | urllib.parse.quote() | urllib.parse.unquote() |
| PHP | urlencode() | urldecode() | application/x-www-form-urlencoded |
| GET | Параметры в строке запроса URL | multipart/form-data | POST |
| Загрузка файлов | application/x-www-form-urlencoded | POST | Параметры в теле запроса |
| @ | %40 | 64 (0x40) | Reserved (authority delimiter) |
| [ | %5B | 91 (0x5B) | Reserved (IPv6 literal) |
| ] | %5D | 93 (0x5D) | Reserved (IPv6 literal) |
Справочник по URL-кодированию
Нужно закодировать или декодировать URL? Попробуйте наш бесплатный онлайн-инструмент URL Encoder / Decoder.
URL-кодирование в JavaScript
URL-кодирование (процентное кодирование) — это метод преобразования символов в безопасный для URL формат путём замены небезопасных символов на знак процента (%), за которым следуют две шестнадцатеричные цифры. Это гарантирует, что специальные символы, пробелы и не-ASCII символы могут быть безопасно переданы в URL без нарушения синтаксиса URL.
URL-кодирование в Python
encodeURI() предназначен для кодирования полного URL и сохраняет символы, имеющие специальное значение в URL, такие как /, ?, & и #. encodeURIComponent() кодирует отдельный компонент URL (например, значение параметра запроса) и кодирует все специальные символы, включая те, которые encodeURI сохраняет. Используйте encodeURIComponent() для значений параметров запроса и encodeURI() для полных URL.
URL-кодирование в PHP
| Функция кодирования | Функция декодирования | Тип формы |
|---|---|---|
| Context | URLs and URIs | HTML documents |
| Format | %XX (percent + hex) | &name; or &#NNN; |
| Example for < | %3C | < |
| Example for & | %26 | & |
| Example for " | %22 | " |
| Purpose | Safe URL transmission | Prevent HTML injection |
| Specification | RFC 3986 | HTML Living Standard |
В URL-кодировании пробелы становятся %20. В данных формы (application/x-www-form-urlencoded) пробелы становятся +. Это различие существует по историческим причинам, уходящим корнями в раннюю спецификацию HTML. При декодировании параметров запроса обрабатывайте оба варианта. При кодировании параметров запроса, %20 технически более корректен, но + широко принимается.
URL-кодирование в программировании
Используйте URL-кодирование всегда, когда включаете предоставленные пользователем данные в URL, особенно в параметрах запроса и компонентах пути. Также используйте его при создании URL программно, когда значения могут содержать специальные символы. Никогда не пропускайте кодирование для пользовательского ввода — это может сломать URL или создать уязвимости безопасности.
Декодирование URL
URL-кодирование напрямую не влияет на SEO, но неправильное кодирование, вызывающее неработающие URL, может навредить SEO, создавая ошибки сканирования. При использовании не-ASCII символов в URL, правильное кодирование гарантирует, что поисковые системы могут корректно сканировать и индексировать ваши URL. Используйте читаемые слова в URL, где это возможно, и полагайтесь на кодирование только для специальных символов.
// encodeURI - encodes a complete URL
// Preserves: :, /, ?, #, &, =, +, @, ;, ,, !, ~, *, ', (, )
const url = encodeURI("https://example.com/search?q=hello world");
// Result: "https://example.com/search?q=hello%20world"
// encodeURIComponent - encodes a URL component
// Encodes ALL special characters including URL delimiters
const param = encodeURIComponent("price=100&discount=20");
// Result: "price%3D100%26discount%3D20"
// Never use escape() - it is deprecated
// It does not handle Unicode correctlyencodeURIencodeURIComponentencodeURIencodeURIComponent when you are encoding a single
parameter value.
GET и POST в формах
from urllib.parse import quote, quote_plus, urlencode
# quote - standard URL encoding (spaces as %20)
encoded = quote("hello world&more")
# Result: "hello%20world%26more"
# quote_plus - spaces become + instead of %20
encoded_plus = quote_plus("hello world")
# Result: "hello+world"
# urlencode - encodes a dictionary as a query string
params = {"q": "hello world", "lang": "en"}
query = urlencode(params)
# Result: "q=hello+world&lang=en"Пробелы: + против %20
// urlencode - spaces become +
$encoded = urlencode("hello world&more");
// Result: "hello+world%26more"
// rawurlencode - RFC 3986 compliant (spaces as %20)
$raw = rawurlencode("hello world&more");
// Result: "hello%20world%26more"URL-кодирование и HTML-формы
The space character has two common encodings, and understanding when to use each is important:
- Зарезервированные символы: !, *, ', (, ), ;, :, @, &, =, +, $, ,, /, ?, #, [, ] имеют специальное назначение в URL и должны быть закодированы, когда не используются для этого специального назначения.
- Незарезервированные символы: A-Z, a-z, 0-9, -, _, ., ~ можно безопасно использовать без кодирования.
+application/x-www-form-urlencoded+ is a literal plus sign, not a space. Most
server-side frameworks handle this correctly for query strings, but it
can cause subtle bugs when encoding paths or working with custom URL
schemes.
Распространённые ошибки
URL encoding has significant security implications that every web developer must understand.
Частичное кодирование
%2527%27' on the second pass. If a security filter only checks
the first decode, it would miss the malicious character. This can
bypass input validation, cross-site scripting (XSS) filters, and SQL
injection protections.
<script>%253Cscript%253E<script>, executing the attack.
Кодирование всего URL
A common misconception is that URL encoding hides or protects data. It does not. URL encoding is trivially reversible; anyone can decode a percent-encoded string. Never use URL encoding as a substitute for encryption, authentication, or access control. Sensitive data like passwords, API keys, and personal information should never appear in URLs, encoded or not, because URLs are logged by browsers, servers, proxies, and can be visible in referrer headers.
Двойное кодирование
/redirect?url=https%3A%2F%2Fevil.com. If the application
does not validate the target URL after decoding, attackers can use
this to redirect users to phishing sites. Always validate decoded URL
values against an allowlist of permitted domains.
Инъекции через URL
../../etc/passwd%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64. Web
servers must decode and normalize paths before checking for traversal
attacks.
Двойное кодирование
Что такое URL-кодирование?
When building URLs with dynamic query parameters, always encode the values:
const baseUrl = "https://api.example.com/search";
const query = "user input with special chars: & ? = #";
const url = `${baseUrl}?q=${encodeURIComponent(query)}`;
// Result: "https://api.example.com/search?q=user%20input%20with%20special%20chars%3A%20%26%20%3F%20%3D%20%23"В чём разница между encodeURI и encodeURIComponent?
Path segments that contain special characters need encoding, but you must not encode the path separators:
const category = "electronics & gadgets";
const product = "USB-C cable (6ft)";
const url = `/products/${encodeURIComponent(category)}/${encodeURIComponent(product)}`;
// Result: "/products/electronics%20%26%20gadgets/USB-C%20cable%20(6ft)"Почему пробелы становятся %20 или +?
const encoded = "hello%20world%3F%26%3D%23";
const decoded = decodeURIComponent(encoded);
// Result: "hello world?&=#"Безопасность и URL-кодирование
- Кодирование только части URL: кодирование только параметров запроса, но не всего URL. Это самая распространённая ошибка. Всегда кодируйте каждый компонент URL, который содержит пользовательский ввод.
- Кодирование всего URL целиком: передача полного URL в encodeURIComponent() кодирует ://, / и другие разделители, ломая URL. Используйте encodeURI() для полных URL и encodeURIComponent() для отдельных компонентов.
- Использование неправильной функции кодирования: encodeURI() сохраняет /, ?, &, # и другие символы, имеющие значение в URL. encodeURIComponent() кодирует их. Использование неправильной функции приводит к некорректному поведению.
- Забывание декодировать перед отображением: всегда декодируйте URL-компоненты перед отображением пользователю. Отображение %20 вместо пробела ухудшает пользовательский опыт.
- Кодирование уже закодированных данных: всегда отслеживайте, был ли URL уже закодирован. Кодирование закодированного URL создаёт двойное кодирование, которое ломает URL.
Need to encode or decode URLs quickly? Try our free online URL encoder and decoder tools.
URL Encoder / DecoderDecode URLЧасто задаваемые вопросы
Когда следует использовать URL-кодирование?
URL encoding, also called percent-encoding, is a mechanism that converts characters into a format that can be safely transmitted in a URL. It replaces unsafe or reserved characters with a percent sign followed by two hexadecimal digits representing the character's byte value. For example, a space becomes %20 and a question mark becomes %3F.
Влияет ли URL-кодирование на SEO?
%20 is the URL-encoded representation of a space character. Spaces are not allowed in URLs because they can be ambiguous and break URL parsing. The percent sign followed by 20 represents the hexadecimal value 0x20, which is the ASCII code for a space. Some systems also use + for spaces in query strings, but %20 is the standard encoding.
What is the difference between URL encoding and HTML encoding?
URL encoding converts characters to percent-encoded format (%XX) for safe transmission in URLs. HTML encoding converts characters to entity references (&, <, etc.) for safe display in HTML documents. They serve different purposes: URL encoding is for URLs, HTML encoding is for HTML content. A value like < needs both: %3C in a URL and < in HTML.
When should I use encodeURIComponent vs encodeURI?
Use encodeURI when encoding a complete URL, as it preserves URL structure characters like :, /, ?, &, and =. Use encodeURIComponent when encoding a single URL component value (like a query parameter), as it encodes ALL special characters including those that have structural meaning in URLs. Always use encodeURIComponent for query parameter values.
Can URL encoding be used for security?
URL encoding alone is not a security measure. It is a transport mechanism, not encryption or authentication. In fact, double encoding attacks can bypass security filters by encoding malicious input multiple times. Always validate and sanitize input on the server side, use parameterized queries for databases, and apply proper output encoding for the target context (HTML, URL, JavaScript).