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

  1. drupal_strip_dangerous_protocols($uri);

  2. check_url($uri);

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

drupal7代码如下:

https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_strip_dangerous_protocols/7.x

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文档。