Каков наилучший способ фильтрации URL для ввода? - PullRequest
3 голосов
/ 15 февраля 2009

У меня есть форма, которая принимает URL-адреса от пользователей в PHP.

Какие символы я должен разрешить или запретить? В настоящее время я использую

$ input = preg_replace ("/ [^ a-zA-Z0-9 - \?: #. () \, / \ & \ '\\"] / "," ", $ string);

$ вход = зиЬзЬги ($ ввода, 0255);

Итак, он урезан до 255 символов и может содержать только буквы, цифры и? - _: # (), & '"/

Что-нибудь, что я должен удалить, что я не делаю, или что-то, что я должен удалить, возможно, должно быть в действительном URL?

Ответы [ 4 ]

6 голосов
/ 15 февраля 2009

RFC 1738 , который определяет спецификацию URL, в которой указываются только символы

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-

может использоваться в схеме URL, и только символы

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*'(),;/?:@=&

может использоваться незакодированным в определенной части URL-адреса схемы. (;/?:@=&, если он используется без кодировки, должен использоваться в «зарезервированных целях», но если вы просто проверяете наличие недопустимых символов, вам не нужно об этом беспокоиться). Поэтому, если вы хотите получить полную общность, я бы проверил URL по этому регулярному выражению:

"/([a-zA-Z+.-]+:\/\/)?([a-zA-Z0-9\$\-_\.\+\!\*'\(\),\;\/\?\:\@\=\&]+)/"

(возможно, некоторые из этих побегов не нужны). Если вы ищете только URL-адреса HTTP, (некоторые из них) должны подойти и для других ответов.

3 голосов
/ 15 февраля 2009

Вам нужно разрешить = знак и% для таких вещей, как% 20. Также знак @ является законным

Вы можете проверить URL с помощью регулярного выражения, подобного этому

/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/

Кроме того, я не думаю, что в URL-адресах также разрешены парены и цитаты.

2 голосов
/ 15 февраля 2009

Я бы посоветовал вам проанализировать URI в соответствии со спецификациями (будучи несколько снисходительными по отношению к недопустимым символам), а затем перестроить его строго в соответствии со спецификациями ... Это звучит как много, но у меня есть преимущество в классе I написал и использую для своих собственных проектов.

Я положил его на пастин, потому что он довольно большой.

Пример:

$uri = new N_Uri('http://example.com/path/segments/with spaces?key=value');
echo $uri;

Распечатывает: http://example.com/path/segments/with%20spaces?key=value

0 голосов
/ 15 февраля 2009

Это регулярное выражение, которое я использовал на клонированном сайте TinyUrl:

([a-zA-Z]+://)?([a-z0-9A-Z-]+\.[a-z0-9A-Z\.-]+[a-z0-9A-Z/_?=;%&,+\.\-]+)
...