筛选输入网址的最佳方法是什么?

时间:2009-02-14 23:30:55

标签: url input filter parsing xss

我有一个表单接受来自PHP用户的URL。

我应该允许或禁止哪些字符?目前我使用

$ input = preg_replace(“/ [^ a-zA-Z0-9 - \?:#。()\,/ \&amp; \'\\”] /“,”“,$ string); < / p>

$输入= SUBSTR($输入,0255);

所以,它被修剪为255个字符,只能包含字母,数字和? - _:#(),&amp; '“/

我应该剥离的任何东西,我不是,或者我正在剥离的任何内容可能需要在有效的URL中?

4 个答案:

答案 0 :(得分:6)

定义URL规范的

RFC 1738表示只有字符

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+.-

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

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

可以在URL的特定于方案的部分中以未编码的方式使用。 (;/?:@=&,如果使用未编码,必须用于“保留目的”,但如果您只是检查无效字符,则无需担心这一点)。因此,如果您想要完全通用,我会检查此正则表达式的URL:

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

(可能一些逃脱不是必要的)。如果您只是在寻找HTTP URL,(其中一些)其他答案应该没问题。

答案 1 :(得分:3)

你需要允许= sign和%来代替%20。 @符号也是合法的

您可以使用像这样的正则表达式验证网址

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

此外,我不认为网址中允许使用parens和引号。

答案 2 :(得分:2)

我建议你根据规格解析URI(对非法字符稍微宽松一点),然后严格按照规范重建它...听起来很多但是我有一个关于I类的headstart为我自己的项目编写和使用。

I have put it on pastebin, because it is rather large.

示例:

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

打印出来:http://example.com/path/segments/with%20spaces?key=value

答案 3 :(得分:0)

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

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