【问题标题】:Include file_exists safety包括 file_exists 安全性
【发布时间】:2009-01-29 21:31:04
【问题描述】:
/* 定义页面路径 */ 定义(“PAGE_DIR”,“页/”); if (file_exists(PAGE_DIR."$_GET[page].php")) include(PAGE_DIR."$_GET[page].php");

这有多安全?例如,如果页面位于名为 pages 的文件夹中,您能否在另一个网络服务器上包含该页面?

谢谢

【问题讨论】:

    标签: php security include


    【解决方案1】:

    这根本不安全 - 想想如果 $_GET[page] 包含 ../../../somewhere/else/ 会发生什么

    您应该明确列出允许的页面。

    编辑:我认为它不能包含来自不同服务器的文件,但这仍然不是一件好事。

    【讨论】:

      【解决方案2】:

      将未经处理的用户输入直接传递给命令从来都不是一个好习惯,尤其是像 include() 这样的命令。您不一定知道底层网络服务器/操作系统将如何处理,例如,相对路径、扩展字符等。任何这些,无论是恶意使用还是其他方式,都可能导致用户看到他们不应该看到的东西见。

      一种可能的利用方式:用户将相对路径传递到服务器上已知位置的恶意脚本。 http://webserver/yourscript.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2fhome/bad_user/evil_script

      您的函数可以转换为 pages/../../../home/bad_user/evil_script.php,其中包含有时会很乐意包含。所以你的网页在服务时可以很好地执行 bad_user 的 php 脚本,他可以用它来做各种讨厌的事情。

      至少您应该将 $_GET['path'] 分配给一个新变量并添加斜杠()。

      【讨论】:

      • 使用addlashes() 不会对像../../foo.php 这样的unix 路径做任何事情。 addlashes() 仅用于转义用于数据库查询的字符串,因此它在引号和反斜杠前放置一个斜杠。
      【解决方案3】:

      在验证/清理数据之前使用 $_GET 或 $_POST 进行任何操作都是危险的。假设所有用户都想找你,并在使用数据之前对其进行清理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-06
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-31
        • 2014-04-11
        相关资源
        最近更新 更多