基于PHP安全模板引擎的设计与实现

2014-10-21 14:24刘倍雄臧艳辉
电子世界 2014年12期
关键词:引擎黑客模板

刘倍雄 臧艳辉

【摘要】本文提出了一種自定义的基于PHP模板引擎的安全设计方法,针对编译型模板引擎,总结了PHP当中的不安全的因素,使用正则匹配实现对编译模板安全过滤,提高了模板引擎的安全性。

【关键词】模板引擎;模板安全

PHP是一种被广泛使用的脚本语言,尤其适合于web开发,它具有跨平台,容易学习,功能强大等特点,很多知名的web应用系统都是使用php开发的,如Discuz、phpwind、wordpress、boblog等等。由于PHP系统程序大多数采用编译型模板引擎机制,故从模板出发,攻击网站成为功能,本文从模板引擎出发,对PHP模板安全机制做了系统的分析和设计,有效地对PHP危险函数操作进行安全过滤,提高系统的安全性,降低黑客从模板引擎攻击的危险性。

1.编译型模板引擎工作原理

在模板引擎的运行中,编译型模板接到URL请求后,首先需要判断是否第一次请求该URL,如果是则将该URL所需的HTML模板文件编译成PHP文件,然后进行重定向;否则则认为该URL的模板已经被编译过了,可以立即重定向。编译型模板除了第一次编译的成本比较高之外,只要不修改模板文件,编译好的 cache脚本就随时调用,从而省去了大量的解释时间。由编译模板的工作机制可以看出,只要从HTML的模板出发,就可以达到攻击网站的目的,可以嵌入恶意代码,加入隐藏链接或复制、删除文件的目的。

2.模板引擎危险因素分析

在PHP当中危险的操作有很多,如删除数据表、删除数据、删除文件,复制文件,下载文件,修改Session和Cookie数据,上传和解压文件等等,现将有关PHP编译型模板引擎的危险因素总结如下:

1)不允许直接操作数据库。禁止直接链接数据库并执行数据库操作函数,系统使用数据库操作类封装的方法操作数据库,在操作过程当中严格过滤危险SQL脚本代码,如XSS脚本,又叫CSS (Cross Site Script,简称跨站脚本攻击),恶意攻击者往Web页面里插入恶意HTML代码,或禁止用户直接执行数据库操作语句,直接调用远程恶意数据库数据,危险函数有mysql_开头的数据库管理函数,如mysql_query()。

2)不允许修改session,禁止对session进行操作,防止黑客伪造session数据登录网站或者获取更高级的web管理权限,对网站安全构成实质性威协,危险的函数有init_session、set_session、delete_session。

3)不允许使用多重变量和变量函数。对模板的编译,将使用一次性编译,对多重变量和变量函数将不再进行编译转化,从而有效地提高模板引擎的效率和降低黑客伪造函数的机率。

4)禁止使用ftp相关函数。禁止通过执行FTP函数来上传及下载文件。并禁止创新新的对象,并给对象赋值,防止执行危险操作类,如解压、打包文件。

5)禁止使用以preg开头的正则表达式匹配函数。禁止使用如preg_match函数进行正则表达式匹配操作,防止黑客通过字符串拼接和替换的操作来构造拼接成危险操作函数,如preg_replace('/xx/e','file_put'.'_contents("\$1")')。

6)禁止调用文件函数。防止黑客对系统文件进行篡改、复制、生成和删除文件,同时防止读入远程文件,主要的函数有opendir、readdir 、readdir 、file_get_contents 、file_put_contents、file、touch、tmpfile、chown、chgrp、chmod、rename、tempnam、fopen、fsockopen、fread、fgets、fclose、fputs、fwrite、unlink、rm、write_file、read_file、readfile、fopen、fsockopen、fread、fgets、fclose、fputs、fwrite、unlink、rm、write_file、read_file、readfile等。

7)禁止引用其他文件。禁止在模板当中使得include、include_once、require、require_once引用除了系统模板之外的模板或文件,防止引用恶意文件。

8)除了以上危险因素,其它主要的危险函数操作有:getenv、eval、create_function、exec、system、passthru、pcntl_exec、phpinfo、define、dl、call_user_func、call_user_method、register_shutdown_function、register_tick_function、debug_backtrace、debug_print_backtrace、show_source、highlight_file、header、debug_zval_dump。

3.自定义模板引擎实现

对HTML模板,使用模板引擎进行编译,在编译过程中,对HTML模板使用preg_match_all进行全局正则表达式匹配,以检测模板当中是否包含危险函数,如果匹配到相关的危险函数,则进行报错输出,并将错误输出到PHP模板当中,从而达到安全提示和防护的作用,实现的关键代码如下:

/*

$d_func 定义危险函数集

*/

$d_func =

//变量函数不允许使用

'\$[^\(\)\{\}\|\?\.\/\*\s<;=,&!%]+|'.

//危险函数也不允许使用

'eval|create_function|exec|system|passthru|pcntl_exec|phpinfo|define|dl|call_user_func|call_user_method|register_shutdown_function|register_tick_function|debug_backtrace|debug_print_backtrace|show_source|highlight_file|init_session|set_session|delete_session|header|debug_zval_dump|'.

//禁止使用mysql,ftp相关函数

'mysql\w+|ftp_\w+|'.

//禁止使用preg开头的函数

'preg_replace|preg_replace_callback|preg_filter|'.

//禁止调用文件函数

'opendir|readdir|rmdir|file_get_contents|file_put_contents|file|touch|tmpfile|chown|chgrp|chmod|rename|tempnam|fopen|fsockopen|fread|fgets|fclose|fputs|fwrite|unlink|rm|write_file|read_file|readfile';

/*

$template_safe定义安全过滤数组

*/

$template_safe = array(

'db' => '/(DB_master|DB_slave)/i', //不允许直接操作数据库

'ref' => '/(=|\(|,)\s*&\s*\$/i', //禁止引用赋值

'session' => '/(ETSESSION|_ETSESSION)/i', //不允许改session

'vvar' => '/\$[\s\{\$]/i', //禁止多重变量

'function' => '/('.$d_func .')\s*\([\s\S]*?\)/i', //危险函数

'obj' => '/(?:new|clone)\s+\$*'.$var .'/i', //不允许创建新对象

'assign' => '/\$[a-zA-Z_\x7f-\xff][^-\$]*?->[^=;\(\)\{\}]+?=/i', //禁止给对象赋值

'include' => '/(include_once|require_once|include|require)(?![a-zA-Z0-9_]+|\s+template\()/i'

//禁止通过系统定义的include template()之外的include引用模板

);

/*

用foreach进行遍历,preg_match_all进行正则匹配,检测模板当中的危险函数

*/

foreach($template_safe as $k => $v){

$s = '';

if(preg_match_all($v,$t,$m)){

foreach($m[1] as $i => $func){

$s = $m[0][$i];

break;

}

}

}

4.结论

对PHP编译型模板,本文尝试从HTML模板及编译过程出发,总结归类出针对模板引擎的危险操作函数,在编译过程中,通过正则匹配过滤危险函数,保证了编译型模板引擎的安全,从而降低黑客从模板引擎攻击网站的成功率,达到预期的效果。

参考文献

[1]刘佳,卢显良.小型高效模板引擎的设计与实现[J].计算机应用研究,2006,23(4):222-224.

[2]屈建明,陈洁.FreeMarker模板引擎动态生成网页的应用研究[J].计算机与现代化,2011(003):121-123.

[3]流年.ThinkTempIate模板引擎的设计[J].软件世界,2007(11):44-45.

[4]姬一文,吴庆波,杨沙洲.一种服务器端模板引擎的改进与实现倡[J].计算机应用研究,2011,28(3).

[5]南軼,李先国.模板技术在内容管理系统中的研究与应用[J].微电子学与计算机,2012, 29(006):180-184.

[6]徐杰.PHP编译型模板的设计与实现[J].信息系统工程,2012(4):38-39.

猜你喜欢
引擎黑客模板
铝模板在高层建筑施工中的应用
铝模板在高层建筑施工中的应用
欢乐英雄
多少个屁能把布克崩起来?
网络黑客比核武器更可怕
蓝谷: “涉蓝”新引擎
铝模板在高层建筑施工中的应用
城市综改 可推广的模板较少
无形的引擎
基于Cocos2d引擎的PuzzleGame开发