防止在PHP中的网址篡改

时间:2010-10-24 20:03:54

标签: php url tampering

这是一个测试引擎应用程序,由我设置了5篇论文..作为5个php页面

申请流程

Login.html

check.php //检查凭证是否正确

如果正确则

main.php //用户点击此页面中的“take test”,显示5篇论文中的1篇...

但是一旦我登录,我就可以将网址更改为我想要的试卷网址。论文名称为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页......

在eac页面中我有这个代码......

我检查是否设置了Session变量....如果设置了......这意味着它已经访问了页面.....但是这段代码不起作用...我使用变量_SESSION [ '页'] 在宣布之前???

3 个答案:

答案 0 :(得分:3)

最好的方法是在应用程序中构建真正的身份验证和授权。然后,提供纸张的URL需要验证用户是否可以在提供之前查看该页面。

无论你在check.php做什么,都要在纸质页面上进行。

答案 1 :(得分:1)

很多替代品。一对夫妇:

  • 不要在网址中对纸张名称进行编码,而是从名为test-paper.php的页面中返回所选纸张的内容。

  • 跟踪用户有权在用户会话中看到的论文。检查每个测试纸页面是否允许用户查看此页面,如果不是,则返回403 Forbidden(或错误页面)。

更多,我确定。

答案 2 :(得分:1)

您遇到的问题大多可以通过在默认处理程序脚本周围安排代码来解决。 (参见下面的指南。)

将信息传递给这样的脚本有两种基本方法(正如我在上面的评论中所说)。基本方法是通过GET变量,如http://www.example.com/main.php?p=1

如果您想拥有更多访问者友好的网址,可以使用.htaccess文件中的RewriteRule将不错的网址转换为您的处理程序可以理解的网址。 (您需要启用mod_rewrite。)

对于这个特定问题,这可能有些过分,但这里有一些安全网络应用指南。我认为它们都是相关的:

  1. 将您的敏感信息置于公共网络根目录之外
  2. 默认情况下,不显示任何信息。只有在用户获得积极授权的情况下才能显示信息。
  3. 理想情况下,这包括网址(如果他们输入了有效的网址,但他们未获得授权,请不要让他们知道他们已经到达了有效的网址)。一种方法是重新定向(如您所做的那样将位置标题设置)到登录页面(如果它们未经授权)。
  4. 创建默认处理程序脚本。此中央脚本将包含所有需要的文件并调用所有需要的函数。将所有请求信息传递给此处理程序,并将其输出所有HTML。
  5. 要求#3:在函数和类中封装代码。这样,你的默认处理程序可以在它准备就绪时调用它们,只要你需要它们,而不仅仅是因为它们恰好被包含在内。这使您可以更好地控制应用程序的流程。
  6. 代替在整个代码中随机放置HTML echo将所有HTML输出返回到主处理程序,这将收集它并在准备好后将其全部输出到一个位置。散布在周围的随机echo会使安全漏洞更容易突然出现。
  7. 不信任用户输入。如果您要使用从$_GET$_POST获得的值,请在使用之前确保它是有效值。

  8. 修改

    (这是更具体的,并且直接针对您的代码)

    3个原因导致您的代码无法按预期运行:

    1. 您在第一行if(!isset($_SESSION['page'])上遗漏了一个右括号。

    2. 编写代码的方式,如果用户访问页面时已设置$_SESSION['page'],则会将其重定向到登录页面。您可以通过将header('Location:login.php'); exit;放在if子句中并完全删除else子句来解决此问题:

      if(!isset($_SESSION['page'])) {
         header('Location:login.php');
         exit;
      }
      $_SESSION['page']=$_SERVER['SCRIPT_NAME'];
      
    3. 您需要在首次登录时设置$_SESSION['page'],以便他们能够查看第一页。

    4. 我建议使用$_SESSION['page']的整数而不是脚本名称。这样,您可以在登录时将$_SESSION['page']设置为1,并且每次成功查看页面时,将$_SESSION['page']递增1。考虑$_SESSION['page']表示允许该用户查看的下一篇论文

      您可以在每张纸上设置$pageid。每次他们尝试查看网页时,如果$_SESSION['page']小于$pageid,请不要让他们查看该网页。