2011-02-10 72 views
3

的index.php:PHP定义安全问题?

define("included", true); 

包含的页面:

if (included !== true) header('HTTP/1.1 404 Not Found'); 

目的的代码是直接禁止访问,但允许它,如果包括在内。我不确定这是否会带来风险。我不允许覆盖.htaccess,所以我坚持使用PHP替代方案。

任何帮助将不胜感激!

+0

似乎很好。唯一的建议是在if中添加`exit;`语句,因为头文件不会终止应用程序,它仍然会处理。这和常量通常是所有的大写,这将是我的其他建议:) – 2011-02-10 23:24:11

+0

这通常表示一个不好的应用程序设计。应该避免在main中执行的代码。包括应该定义函数,所以这种解决方法是不必要的。 – mario 2011-02-10 23:27:21

回答

4

一个性感办法是...

defined('included') OR exit; 

也就是说,使用正确的函数(defined())查看是否定义了一个值,然后利用short circuit evaluation。另外,您可以使用现有的定义而不是专门创建一个定义,例如,引导文件可以定义类似...

define('DOCROOT', realpath(basename(__FILE__))); 

...在这种情况下,你可以安全地使用DOCROOT

你也应该保持除了你的引导任何PHP文件的文档根目录上面,然后确保你的网站是安全的从directory traversal attacks :)

1

这是好的,但我想将其更改为:

if (!defined('included')) { 
    header('HTTP/1.1 404 Not Found'); 
    // actually make the request stop, since clients will not stop on 404 headers 
    die(); 
} 

欢呼

0

通常您使用安装喜欢自己正在做的,但执行dieexit放弃它,而不用担心重定向。即使他们知道该文件存在,但如果您无法访问该内容,则无用。

的common.php(或你的index.php,这取决于你的设置)

<?php 
    define('IN_PAGE',true); 
    ... 
?> 

include_file.php

<?php 
    defined('IN_PAGE') or die('Unallowed access'); // or header('HTTP/1.0 404 Not Found'); exit; 
    ... 
?> 
1

如何只将所有不属于文件应该直接访问webserver的文档根目录之外的目录?

0

一个更简单的方法是:

<?php 
    @runtime_presence(); 

如果函数存根不集中前确定这导致了致命错误。 (标题重定向和一个漂亮的错误消息没有用作安全措施。)