Как лучше всего фильтровать URL-адреса для ввода?

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

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

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

$ input = substr ($ input, 0,255);

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

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


person JAL    schedule 14.02.2009    source источник
comment
Следует упомянуть, что я также использую trim () и strip_tags ().   -  person JAL    schedule 15.02.2009


Ответы (4)


RFC 1738, в котором определяется спецификация URL, гласит, что только символы

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-

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

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

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

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

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

person David Z    schedule 15.02.2009

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

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

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

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

person vishvananda    schedule 14.02.2009

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

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

Пример:

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

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

person Mike Boers    schedule 15.02.2009
comment
Можешь перепрошить с вечно проверенным? Или примите себя. знак равно - person strager; 15.02.2009
comment
@jimmy: Добро пожаловать! Имейте в виду, что он не анализирует все идеально (т. Е. Вы не можете выгрузить в него все произвольные двоичные данные), но он снова будет выводить в действительный URI. Он без проблем проанализировал все ублюдки URI, которые я ему когда-либо бросал. Я просто надеюсь, что документация актуальна ... - person Mike Boers; 16.02.2009

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

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