[英]PHP looking for a neat way to prevent unauthorised users from viewing pages
我正在寻找一种方法来阻止未经授权的用户查看页面,而不是让我们说if authed { show page } else { show error}
将所有内容包装在一个if authed { show page } else { show error}
我的网站目前设置如下:
的index.php
require_once __WEBROOT__ . '/templates/default/header.tmpl';
require_once content('p');
require_once __WEBROOT__ . '/templates/default/footer.tmpl';
内容()
function content($GETvar)
{
$content = '';
$root = __WEBROOT__;
$location = 'content';
$files = scanDirRecursive($root . '/content/');
if (isset ($_GET[$GETvar]))
{
$path = str_replace('\\', '/', $_GET[$GETvar]->toHTML());
if (in_array("$root/$location/$path", $files))
{
$content = "$root/$location/$path";
}
else
{
$content = $root . '/templates/default/errors/404.php';
}
}
else
{
$content = __WEBROOT__ . '/content/home.php';
}
return $content;
}
这很好用。 当我玩auth选项时,我在“内容”页面顶部的“返回”中查看。 这最终阻止了内容页面的加载,但保持模板的机智(不像die())。
所以我想知道,这样安全吗? 或者是否发生了我没有看到的错误......
使用前控制器模式。 而不是将所有页面都作为单独的PHP文件,只有一个“入口点”。
基本上,让index.php文件像index.php一样工作吗?p = foo其中foo定义了要显示的页面。 这样,您的所有请求都将通过index.php,您可以在一个地方包含所有访问权限。 请记住要小心不要包含任意文件 - 这种方法常见的初学者错误。
但是,正如所指出的,您可能希望研究像Cake或Zend这样的框架如何执行此工作。
需要一个登录页面,用于设置会话变量,例如userid。 然后在每个页面上调用一个函数来检查授权。 如果它同时考虑页面和用户,它可能会放在标题中。
如果没有用户登录,或者不允许他们访问该页面,则重定向到登录页面 - 最好添加一条消息,说明他们无法登录而无法使用他们请求的页面。
注销应该清除会话变量。 此外,如果存在会话超时,请在重置超时的时间在会话变量中记录时间戳。
为什么重新发明轮子? 每个php框架都有它的acl模块,你可以用最少量的编码来设置安全策略。 看看cakephp或google acl框架......
如果登录,请不要执行此操作{} else {complain,}只是将它们重定向到登录页面,如果它们未被识别,则die();
我发现简单地为这些东西抛出一个Exception很方便。 有几种策略,但有一种可能涉及以下情况:
function show_content() { if( ! $user_is_allowed_to_see_this_content ) { throw new Exception('This user may not see this content', 403); } // Continue on with the content code }
默认情况下,这只会出错,但您可以使用set_exception_handler()函数来定义抛出异常时特别发生的情况。 这使您可以在与内容处理代码分开的位置定义“当出现问题时应该做什么”逻辑,我发现这使得事情变得更加整洁。
例如:
function custom_exception_handler( Exception $exception ) { // Log the Exception error_log( $exception->getMessage(), 0 ); // Return the generic "we screwed up" http status code header( "HTTP/1.0 500 Internal Server Error" ); // return some error content die("We're sorry. Something broke. Please try again."); } // Now tell php to use this function to handle un-caught exceptions set_exception_handler('custom_exception_handler');
值得注意的是,这是一种处理所有逻辑故障事件的通用方法,而不仅仅是身份验证失败。 文件未找到异常,验证异常,数据库查询异常,需求限制异常; 这些都可以以相同的方式在同一个地方处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.