我正在编写一些PHP代码,需要使用不同内容目录的路径,并在稍后包含页面的各个部分。我正在尝试确保这些路径是正确的,并且没有违反应用程序的规则。这些规则如下:
事实上,这似乎是一项很大的工作,特别是每次访问页面之前必须运行它,然后才能进行其他操作(例如检查我正在提供的页面的缓存版本),因为路径基本上是静态的。
我想,网站的维护者(目前是我)应该知道他们提供的路径,并且应该自己检查它们是否符合规则。但是,我认为更明智的是,我应该对检查路径是否符合规则也同样负责,因为意外总会发生(特别是在网站不断增长/更改/有新的维护者的情况下...),在安全关键环境中如果可以捕获到,则没有理由不去捕获。
因此,我已经基本上决定要检查这些路径,问题是我的方法有多好?它似乎是一个次优解。您如何改进它或建议什么替代方案?是否有办法解决每次页面加载时都需要检查的问题,以及某种方式只在配置更改时进行检查?(那将是理想的,但我认为不容易实现。)
谢谢。
PRIVATEDIR
(相对于DOCUMENT_ROOT
定义)必须在DOCUMENT_ROOT
之上。CONTENTDIR
(相对于PRIVATEDIR
定义)必须位于PRIVATEDIR
之下,并且不能返回到DOCUMENT_ROOT
。- 其余的
*DIRS
(相对于CONTENTDIR
定义)必须位于CONTENTDIR
之下。
error_reporting
,请不要重复此操作!我误解了该命令的工作方式。如果您想知道原因,请参见评论中stealthyninja和Col. Shrapnel的备注(感谢他们向我指出)。private $opts = array( // defaults
'PRIVATEDIR' => '..', // relative to document root
'CONTENTDIR' => 'content', // relative to private dir
...
...
);
private function __construct($options) { //$options is the user defined options
error_reporting(0);
if(is_array($options)) {
$this->opts = array_merge($this->opts, $options);
}
if($this->opts['STATUS']==='debug') {
error_reporting(E_ALL | E_NOTICE | E_STRICT);
}
$this->opts['PUBLICDIR'] = realpath($_SERVER['DOCUMENT_ROOT'])
.DIRECTORY_SEPARATOR;
$this->opts['PRIVATEDIR'] = realpath($this->opts['PUBLICDIR']
.$this->opts['PRIVATEDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['CONTENTDIR'] = realpath($this->opts['PRIVATEDIR']
.$this->opts['CONTENTDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['CACHEDIR'] = realpath($this->opts['CONTENTDIR']
.$this->opts['CACHEDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['ERRORDIR'] = realpath($this->opts['CONTENTDIR']
.$this->opts['ERRORDIR'])
.DIRECTORY_SEPARATOR;
$this->opts['TEMPLATEDIR' = realpath($this->opts['CONTENTDIR']
.$this->opts['TEMPLATEDIR'])
.DIRECTORY_SEPARATOR;
...
...
...
// then here I have to check that PRIVATEDIR is above PUBLICDIR
// and that all the rest remain within private dir and don't drop
// down into (or below) PUBLICDIR again. And die with an error if
// they don't conform.
}
事实上,这似乎是一项很大的工作,特别是每次访问页面之前必须运行它,然后才能进行其他操作(例如检查我正在提供的页面的缓存版本),因为路径基本上是静态的。
我想,网站的维护者(目前是我)应该知道他们提供的路径,并且应该自己检查它们是否符合规则。但是,我认为更明智的是,我应该对检查路径是否符合规则也同样负责,因为意外总会发生(特别是在网站不断增长/更改/有新的维护者的情况下...),在安全关键环境中如果可以捕获到,则没有理由不去捕获。
因此,我已经基本上决定要检查这些路径,问题是我的方法有多好?它似乎是一个次优解。您如何改进它或建议什么替代方案?是否有办法解决每次页面加载时都需要检查的问题,以及某种方式只在配置更改时进行检查?(那将是理想的,但我认为不容易实现。)
谢谢。
error_reporting(E_ALL | E_STRICT);
,然后永远不要再动它了。 - Your Common Senseerror_reporting
的代码。但显然它并没有做我以为它会做的事情。 - tjmerror_reporting(E_ALL | E_NOTICE | E_STRICT)
与error_reporting(E_ALL | E_STRICT)
相同,因为E_ALL
已经包括除E_STRICT
之外的所有内容。 (请参见文档) - Tgr