【问题标题】:Restricting access to specific pages限制对特定页面的访问
【发布时间】:2014-09-30 11:38:04
【问题描述】:

我正在开发一个网站,用户必须登录后才能访问他们的个人资料。但我不知道如何通过在地址栏中键入 sitename.com/profile.php 来限制用户直接访问个人资料页面。我在 Stack Overflow 上搜索时遇到了这段代码 这是我的 login.php 脚本

if(!empty($row['username']) AND !empty($row['password']))
{
    $_SESSION['login'] = true;
    $_SESSION['username'] = $row['username'];
    echo '<script>window.location = "profile.php"</script>';
}

现在我在 profile.php 的顶部放了这段代码

<?php
session_start();
if (!$_SESSION['login']){ 
echo '<script>window.location = "index.html"</script>';
}
?>

用户仍然可以通过直接输入 URL 来访问 profile.php。我做错了什么?

【问题讨论】:

  • 不要使用echo '&lt;script&gt;window.location = "index.html"&lt;/script&gt;'; 它会导致浏览器往返包含整个网页,只是因为浏览器会从服务器请求另一个页面,所以这一切都会被忽略。使用header('Location: profile.php'); exit;
  • 谢谢它的工作。如果我不输入 exit 怎么办?最后
  • 添加 'session_start();' login.php 表单顶部的命令也是如此。开始使用 Sessions 后,您必须在应用程序的每个页面顶部添加 session_start();,以维护会话。
  • 如果不添加exit; PHP 会继续运行脚本。正如您已经知道的那样,您想向浏览器发送一个完全不同的页面,继续该脚本的其余部分是没有意义的,并且在许多情况下,继续会做您不希望在这种情况下做的事情。
  • 谢谢你的简单解释:)

标签: javascript php mysql session


【解决方案1】:

您需要一个层次结构,然后需要确定允许查看页面所需的权限级别。这是权限的示例列表...

10 - 管理员

9 - 网站管理员

8 - 助理网站管理员

7 - 版主

6 - 高级会员

5 - 成员

4 - 受罚成员

3 - 已注册但未通过电子邮件验证的会员

2 - 人类访客

1 - 搜索引擎

0 - 禁止帐户

因此,例如,当某人注册时,您将他们的帐户设置为 3 级,一旦他们验证了他们的电子邮件地址,您就将其帐户(数据库和会话)的级别提高到 5。如果您正在编写软件,您将成为10 在这个级别的权限。

您希望将权限分配给会话变量,例如$_SESSION['user_permission'](并为您需要的其他变量使用前缀 user_)。当您需要检查您必须使用isset()的权限时,这是一个示例...

<?php
if (isset($_SESSION['user_permission']) && $_SESSION['user_permission']>=5)
{
 echo '<p>Member-only content visible here.</p>';
}
else if (isset($_SESSION['user_permission']))
{
 echo '<p>Stop causing trouble and you would be able to see this page.</p>';
}
else
{
 echo '<p>Please register a new account.</p>';
}
?>

使用isset() 时,请确保括号的数量正确,这是每个人 都会犯的常见错误。如果您不使用isset(),那么黑客可以通过错误消息来找出您代码中的弱点,因此始终检查事物而不是假定它们存在。

你也不需要重定向人,只需让 PHP 为客户端开始的页面拉取内容,这是 我是新手,我有很酷的想法阶段我们一切都过去了,当你意识到你让事情过于复杂时,你就会掌握这些概念。例如,在我的 blog/ 上,只有当我或其他管理员/网站管理员登录时,编辑链接才会出现,而无需为权限重新创建整个页面所有,尽管有些情况非常明显,例如控制面板,在这种情况下您希望尽早检查权限并确保提供正确的 HTTP 错误代码。

最后我从来没有发现 PHP 的 empty() 很有用,它可能只适用于某些类型的数据,相反我会测试是否(例如$something=='')

【讨论】:

  • 非常优雅,但是对于实际提出的问题 MAJOR OVER KILL
  • @RiggsFolly 如果这有助于他们获得更好的洞察力,以便尽早编写更好的代码,这将意味着尝试解决所有问题的麻烦更少......然后还有其他人问同样的问题,最后读到这个。对某些人来说,这似乎有点过头了,但最终可能会为其他人节省数百小时。
【解决方案2】:

考虑到您正在使用一个,请在 Apache 配置中尝试此操作。我用过“本地主机”。替换为您的域。

RewriteEngine on 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost [NC] 
RewriteCond %{HTTP_REFERER} !^http://(www\.)?localhost.*$ [NC] 
RewriteRule \.(php)$ - [F] 

您可以通过在 RewriteRule 中使用以下 OR 条件来扩展文件限制。例如。与 PHP 一起限制 JPG 访问。

RewriteRule \.(php|jpg)$ - [F] 

希望这会有所帮助。

【讨论】:

  • 这个 Apache 配置文件在哪里
  • 真的是里格斯吗?正确阅读他的问题。它是“如何通过在地址栏中输入 sitename.com/profile.php 来限制用户直接访问个人资料页面?”。
  • 真的是@SeshaKiran,这是个好建议。他希望能够停止对未登录用户的访问。不要完全停止对页面的任何访问。编写一个网页然后禁止从您的 Apache 配置或 .htaccess 文件访问它并没有多大意义。
  • 同意不同意。他的要求是“用户仍然可以通过直接输入 URL 来访问 profile.php”。他不想要那种访问权。答案也是如此。你投了反对票。请。纠正它。看来你读错了。
  • @SeshaKiran 不怕。看来您实际上误解了这个问题,而不是我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 2010-11-01
  • 2015-08-08
相关资源
最近更新 更多