题
这是一个测试引擎应用程序,其中有我设置的 5 篇论文..as 5 个 php 页面
申请流程
登录.html
check.php // 检查凭据是否正确
如果正确的话
main.php //用户单击此页面中的“参加测试”,该页面将显示 5 篇论文中的 1 篇...
但是一旦我登录,我就可以将 url 更改为我想要的试卷的 url..试卷名称 r 1.php 2.php....
我该如何阻止这个...?
if(!isset($_SESSION['page'])//Tp
continue; //Tp
else
{
header('Location:login.php');
exit;
} //Tp
$_SESSION['page']=$_SERVER['SCRIPT_NAME'];//tp
这是正确的吗……正如我所说,有 5 页……
在每个页面我有这个代码......
我检查是否设置了会话变量...。 ]在宣布它之前???
解决方案
您遇到的问题主要可以通过围绕默认处理程序脚本安排代码来解决。(请参阅下面我的指南。)
有两种基本方法可以将信息传递给这样的脚本(正如我在上面的评论中所说的)。基本方法是通过 GET 变量,例如 http://www.example.com/main.php?p=1
.
如果您想拥有更多对访问者友好的 URL,您可以使用 RewriteRule
在一个 .htaccess
文件将漂亮的 URL 转换为处理程序能够理解的 URL。(你需要 模组重写 已启用。)
对于这个特定问题来说,这可能有点过分了,但这里有一些安全网络应用程序的指南。我认为它们都是相关的:
- 放置您的敏感信息 在公共网络根之外.
- 默认不显示任何信息. 。仅在用户获得明确授权的情况下才启用信息显示。
- 理想情况下,这包括 URL(如果他们输入有效 URL 但未获得授权,请不要让他们知道他们已到达有效 URL)。一种方法是如果未经授权,则重定向(像您一样设置位置标头)到登录页面。
- 创建默认处理程序脚本。 该中央脚本将包含所有需要的文件并调用所有需要的函数。将所有请求信息传递给此处理程序,并让它输出所有 HTML。
- #3 的要求: 封装你的代码 在函数和类中。这样,您的默认处理程序就可以在准备好时调用它们,只有当您需要它们时,而不仅仅是因为它们碰巧被包含在内。这使您可以更好地控制应用程序的流程。
- 代替
echo
在整个代码中的随机位置使用 HTML, 将所有 HTML 输出返回到主处理程序, ,它将收集它并在准备好后将其全部输出到一个地方。随机的echo
分散的地方更容易出现安全漏洞。 - 不要相信用户输入. 。如果您要使用从中获得的值
$_GET
或者$_POST
, ,在使用之前请确保它是有效值。
编辑:
(这更具体,并且针对您现在的代码)
有 您的代码无法按预期运行的 3 个原因:
您在第一行遗漏了右括号
if(!isset($_SESSION['page'])
.你的代码的编写方式,如果
$_SESSION['page']
当用户访问该页面时已经设置,他们将被重定向到登录页面。您可以通过将header('Location:login.php'); exit;
在里面if
条款并删除else
条款完全:if(!isset($_SESSION['page'])) { header('Location:login.php'); exit; } $_SESSION['page']=$_SERVER['SCRIPT_NAME'];
你需要设置
$_SESSION['page']
当他们第一次登录时,他们将能够查看第一页。
我建议使用整数 $_SESSION['page']
而不是脚本名称。这样你就可以设置 $_SESSION['page']
当他们登录时为 1,并且每次他们成功查看页面时,都会递增 $_SESSION['page']
一个。考虑 $_SESSION['page']
意思是 允许该用户查看的下一篇论文.
您可以设置一个 $pageid
在每张纸上。每次他们尝试查看页面时,如果 $_SESSION['page']
小于 $pageid
, ,不要让他们查看该页面。
其他提示
最好的办法是建立真正的身份验证和授权到应用程序中。然后,供应纸需要的URL,以验证用户被允许服务之前查看的页面。
不管你在做check.php,做纸页本身上。
有很多选择。一对夫妇:
不要在 URL 中对论文名称进行编码,而是从名为 test-paper.php 的页面返回所选论文的内容。
跟踪用户有权在用户会话中查看的论文。检查每个测试试卷页面是否允许用户查看该页面,如果不允许,则返回 403 Forbidden(或错误页面)。
我确信还有更多。