1

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

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

Nginx

rewrite ^ /index.php last;

索引.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
    }
?>
4

1 回答 1

1

是的,您担心 LFI(本地文件包含)攻击。这是可能的。当前,当您检查 . URI 中的 / 和 \ 字符,这将防止目录遍历攻击。这是相当不错的。如您所料,如果您包含这样的文件:

index.php?file=something.php 并在 index.php 中包含 $_GET['file'];

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

所以你必须采取措施。这是 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

于 2013-01-07T19:13:09.170 回答