原文链接: http://drupal.org/node/117058
对于初学者来说,始终确保上载到“files”目录或其他指定的目录的文件有(上传,查看,下载,删除)的权限。注意,在下面的示例代码中的硬编码目录“files”是用来简化的例子,在现实中这个目录是可配置的。
用户没有阅读或删除重要的系统文件(如 /etc/passwd 或 sites/default/settings.php) 的权限。虽然这些示例集中删除,请记住读取任意文件也是不可取。
<?php
/** Example 1 - Insecure
* Arbitrary file deletion.
*
* $file is path/filename (eg files/myfile.txt) provided by the user.
*/
file_delete($file);
?>
恶意用户可以滥用通过Example 1中提供不同的目录(如 /sites/default/settings.php)的文件名的中授予对其的信任。对执行Drupal(通常web服务器)的这些文件用户帐户的权限攻击显然受限制。
<?php
/** Example 2a - Insecure
* Arbitrary file deletion.
*
* $file is a filename (eg. myfile.txt) provided by the user.
*/
file_delete("files/$file");
?>
<?php
/** Example 2b - Insecure
* Arbitrary file deletion.
*
* $file is path/filename (eg files/myfile.txt) provided by the user.
*/
// Check whether $file is files/file
if (strpos($file, "files/") === 0) {
file_delete($file);
}
?>
Example 2a 和 2b 尝试通过前面加一个固定的目录与文件名或检查所提供的路径是否以files/开始来缓解攻击。两个例子是父路径 (..)易受攻击的。
如果恶意用户将提供Example 2b ../sites/default/settings.php 和Example 2b files/../sites/default/settings.php 作为路径会怎样?
两个都尝试删除 sites/default/settings.php。
若要正确检查文件的真实路径,请使用Drupal函数file_check_location。
<?php
/** Example 3
* No longer vulnerable to parent path (..) attacks.
*
* $file is path/filename (eg files/myfile.txt) provided by the user.
*/
// Check whether $file is files/file
if (file_check_location($file, 'files') {
file_delete($file);
}
?>