我正在寻找一种方法来防止未经授权的用户查看网页,而不是假设将所有内容都包装在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()不同)。
所以我想知道,这样安全吗?或者是否发生了我没有看到的错误......
答案 0 :(得分:2)
使用前控制器模式。而不是将所有页面都作为单独的PHP文件,只有一个“入口点”。
基本上,让你的index.php文件像index.php一样工作吗?p = foo其中foo定义要显示的页面。这样,您的所有请求都将通过index.php,您可以在一个地方包含所有访问权限。请记住小心不要允许包含任意文件 - 这种方法常见的初学者错误。
然而,正如所指出的,您可能希望研究像Cake或Zend这样的框架如何执行这项工作。
答案 1 :(得分:1)
需要一个登录页面,用于设置会话变量,例如userid。然后在每个页面上调用一个函数来检查授权。如果同时考虑页面和用户,它可能会放在标题中。
如果没有用户登录,或者不允许他们访问该页面,请重定向到登录页面 - 最好添加一条消息,说明他们无法登录而无法使用他们请求的页面。
注销应该清除会话变量。此外,如果存在会话超时,请在重置超时的时间内在会话变量中记录时间戳。
答案 2 :(得分:1)
为什么重新发明轮子?每个php框架都有它的acl模块,你可以用最少量的编码来设置安全策略。看看cakephp或google acl框架......
答案 3 :(得分:0)
如果登录,请不要执行此操作{} else {complain,}只是将它们重定向到登录页面,如果它们未被识别,那么die();
答案 4 :(得分:0)
我发现简单地为这些东西抛出一个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');
值得注意的是,这是一种处理所有逻辑故障事件的通用方法,而不仅仅是身份验证失败。文件未找到异常,验证异常,数据库查询异常,需求限制异常;这些都可以用同样的方式处理。