如何最好地过滤输入的URL?

3
我有一个表单,在PHP中接受用户输入的URL。
我应该允许或禁止哪些字符?目前我使用以下代码: $input= preg_replace("/[^a-zA-Z0-9-\?:#.()\,/\&\'\\"]/", "", $string); $input=substr($input,0,255);
所以,它被修剪到255个字符,并且只能包含字母、数字和? - _ : # ( ) , & ' " /。
我是否需要剥离任何东西,或者我正在剥离一些在有效URL中可能需要的内容?

我应该提到,我也使用trim()和strip_tags()。 - JAL
5个回答

6

RFC 1738定义了URL规范,指出只有以下字符可以在URL中使用:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-

可以在URL方案中使用,只能使用字符

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

可以在URL的特定部分中未编码使用。(如果未编码使用,则必须用于其“保留目的”的;/?:@=&,但如果您只是检查无效字符,则不需要担心这一点)。因此,如果您想要完整性,我建议使用以下正则表达式来检查URL:
"/([a-zA-Z+.-]+:\/\/)?([a-zA-Z0-9\$\-_\.\+\!\*'\(\),\;\/\?\:\@\=\&]+)/"

(可能有些转义不必要)。如果您只需要查找HTTP URL,其他答案应该是可以的。


3

您需要允许等号和百分号,例如%20。同时,@符号也是合法的。

您可以使用以下类似的正则表达式验证URL:

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

我认为括号和引号在URL中也是不被允许的。


1

你能勾选“永久运行”后再重新发布吗?或者你可以自己托管。=] - strager
@jimmy:不用谢!请注意,它并不能完美地解析所有内容(例如,您无法将任意二进制数据转储到其中),但它会输出一个有效的URI。它已经成功解析了我曾经遇到的所有URI变形问题。我只希望文档是最新的... - Mike Boers

0

现在有一个input type="url",它可以用于简单的应用程序,也可能用于复杂的应用程序。


0

这是我在一个我制作的 TinyUrl 克隆网站上使用的正则表达式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接