安全性 - 根据用户内容包含文件

时间:2013-01-07 19:07:26

标签: php security nginx include

出于安全原因,每个请求都会传递给PHP,因为我不想将静态文件暴露给未经授权的人。

我担心某人可能会通过$_SERVER["REQUEST_URI"]变量注入一些恶意代码。我试图删除子文件夹引用,但我仍然不知道它是否安全。

Nginx的

rewrite ^ /index.php last;

的index.php

<?php
    $uri = $_SERVER["REQUEST_URI"];
    $uri = strlen ($uri) > 1 ? substr ($uri, 1) : "index.html";
    $uri = preg_replace ("/\/?\.\./", "", $uri, -1); // Remove sub-folders

    if (file_exists (getcwd () . "/" . $uri)) {
        $extension = substr ($uri, strrpos ($uri, "."));

        switch ($extension) {
            case ".css": $mime = "text/css"; break;
            case ".js": $mime = "application/javascript"; break;
            default:
                $info = finfo_open (FILEINFO_MIME_TYPE);

                $mime = finfo_file ($info, $uri);

                finfo_close ($info);
            break;
        }

        if ($mime === false)
            header ("Content-Type: text/html; charset=utf-8"); // Default
        else
            header ("Content-type: " . $mime);

        require ($uri);
    }
    else {
        // Error, blah blah blah
    }
?>

1 个答案:

答案 0 :(得分:1)

是的,您担心LFI(本地文件包含)攻击。这是可能的。 目前正在检查。 URI中的/和\ chars会阻止Directory Traversal攻击。这是相当不错的。 正如您猜测的那样,如果您包含以下文件:

的index.php?文件= something.php 并在index.php中 包括$ _GET ['file'];

攻击者可以读取服务器中的每个文件,如下所示: 的index.php?FILE = .. / .. / .. / .. / .. / .. / .. / .. / .. / .. / etc / passwd中

所以你必须采取措施。 以下是Imperva关于如何防止LFI和RFI(远程文件包含)攻击的非常好的写作: https://www.imperva.com/lg/lgw.asp?pid=463

没有注册要求: http://www.slideshare.net/Imperva/how-to-prevent-rfi-and-lfi-attacks

此处: http://25yearsofprogramming.com/blog/2011/20110124.htm