当我们处理用户输入的url时,需要当心用户输入不合法的危险协议,同时,当我们需要输出到页面中时,我们要对URL经过HTML编码处理,so下面两个函数可以使用

  1. drupal_strip_dangerous_protocols($uri);

  2. check_url($uri);

去除危险的schemes,使用drupal_strip_dangerous_protocols();

drupal7代码如下:

function drupal_strip_dangerous_protocls($uri){    static $allowed_protocols;	if( !isset( $allowed_protocols ) ){	    $allowed_protocols = array_flip(variable_get('filter_allowed_protocols',array(		    'ftp','http','https','irc','mailto','news','nntp','rtsp','sftp','ssh','tel','telnet','webcal'			)));	}	do{	    $before = $uri;		$colonpos = strpos( $uri ,':' );        if($colonpos > 0){		    $protocol = substr( $uri,0,$colonpos );			//当协议中出现? # 则不认识是url的scheme部分			if( preg_match( '![/?#]!',$protocol ) ){			    break;			}			if( !isset( $allowed_protocols[strtolower($protocol)] ) ){			    $uri = substr( $uri,$colonpos + 1 );			}		}	}while($before != $uri);	return $uri;}

上面这个函数可以去除如javascript:开始的uri,这个函数我们可以使用在需要输出用户输入的url的时候。它被用作check_url()或filter_xss()函数的一部,做为html编码内容返回;也可单独使用,作为字符串传给t()、l()、drupal_attribute()、check_plain()等函数使用。

当需要做为HTML代码输出到页面时,可以是check_url($uri);

drupal7代码如下:

function check_url($uri){    return check_plian(drupal_strip_dangerous_protocols($uri));}

案例参考:

$a = check_url('javascript://www.baidu.com/a/b/c?dd=javascripr:');print_r($a);// //www.baidu.com/a/b/c?dd=javascripr:<script>alert(1)</script>

以上代码仅供参考,详情请参考drupal7API文档。