PHP安全:单一入口

关注安全
0 378

PHP安全:单一入口

PHP项目使用单一入口,用一个入口文件处理所有的HTTP请求和返回所有的请求数据。例如,不管是列表页还是文章页,都是从浏览器访问index.php文件,这个文件就是这个应用程序的单一入口。


1、实现方式


单一入口实现起来很简单,可以在访问index.php时使用一个特定的参数。例如index.php?action=list就是访问列表页,而index.php?action=single则是访问文章页。


单一入口index.php的简单实现代码如下所示。


define('APP_NAME','APP'); // 入口常量


$modular="index"; // 默认模块


$active=SecurityFilter($_GET['action']); // 安全检测


if(!empty($active)) {


$modular=$active;


}


include('controller/'.$modular.'.php'); // 根据$action参数调用不同的代码文件,从而满足单一入口实现对应的不同功能


2、单一入口更安全


单一入口应用程序的所有请求都是通过index.php接收并转发到功能代码中的,所以在index.php中能完成许多实际工作。


由于所有的请求都由index.php接收,因此可以进行集中的安全性检查。如果不是单一入口,那么研发人员就必须记住在每一个文件的开始加上安全性检查代码(当然,安全性检查可以写到另一个文件中,只需要用include语句即可)。


与安全性检查类似,在入口里,还可以对URL参数和POST进行必要的检查和特殊字符过滤、记录日志、访问统计等各种可以集中处理的任务。这样就可以看出,由于这些工作都被集中到index.php来完成,可以减轻维护其他功能代码的难度,对用户的请求更好地进行控制,很大程度上防止攻击者的非法入侵。


单一入口可以使程序可读性更高,更容易维护,相对产生更少的BUG和安全漏洞,推荐使用这种方式进行项目研发和部署。


为了防止恶意用户从非单一入口进入,需要在入口文件开头使用define定义入口常量。


define('APP_NAME', 'APP');//定义入口常量


在非入口文件中用defined来检测用户是否从正常入口进入。如果没有检测到入口常量,则必须让PHP脚本立即停止执行。


defined('APP_NAME') or exit; // 入口常量检测,如果未定义,直接退出程序