You are here

中和危险文件

 

假定你使用的是公共文件下载方法,并且你启用了文件上传。那么当有人上传一个名为bad_exploit.php的文件时,会发生什么呢?当攻击者访问http://example.com/sites/default/files/bad_exploit.php时,它会不会执行?但愿不会,有3个原因。首先,在上传的文件设置的允许的扩展名列表中永远不会出现.php。其次,.htaccess文件应该放在sites/default/files/.htaccess中(参看第20章)。然而,在几个常见的Apache配置中,上传文件exploit.php.txt也可能导致把该文件中的代码作为PHP代码进行执行(参看http://drupal.org/files/sa-2006-007/advisory.txt)。这样就给我们带来了第3个原因:修改文件名字从而无害的呈现文件。作为防御上传可执行文件的一个手段,可以使用下面的函数。
 
file_munge_filename($filename, $extensions, $alerts = TRUE)
    $filename参数是要被修改的文件名字。$extensions是一个字符串,包含了使用空格定界的文件扩展名。$alerts参数是一个布尔值,默认为TRUE,通过使用drupal_set_message()来警告用户,该文件的名字已被修改。返回的是修改后的文件名,向里面插入了下划线来禁止潜在的执行。
 
$extensions = variable_get('upload_extensions_default', 'jpg jpeg gif png txt
doc xls pdf ppt pps odt ods odp');
$filename = file_munge_filename($filename, $extensions, FALSE);
 
$filename 现在为 exploit.php_.txt.
 
    通过在settings.php中将Drupal变量allow_insecure_uploads定义为1,你就可以阻止修改文件名了。但这通常是一个坏点子,因为它带来了安全隐患。
 
file_unmunge_filename($filename)
    这个函数尝试撤销file_munge_filename()的影响,它将“_.”替换为了“.”:
 
$original = file_unmunge_filename('exploit.php_.txt);
 
$original 现在为 exploit.php.txt.
 
    注意,如果在原始文件中,故意使用了“_.”,那么它也将被替换掉。

老葛的Drupal培训班 Think in Drupal

Drupal版本: