使用cookie限制访问

时间:2011-06-22 19:10:43

标签: php security forms http-referer

我正在尝试写一个接受表单(基于cookie)来拒绝/允许访问我正在处理的网站;我无论如何都不是安全专家,所以我需要一些关于如何使我的表单提交更安全的提示,以及如何存储用户请求的原始页面,以便在接受后将它们重定向到正确的页面。

以下是我编写的基本脚本:

<?php
if(isset($_POST['accept'])) {
  setcookie ('accept', '1');
  header('Location: http://www.the_page_that_was_requested');
  exit();
} elseif(isset($_POST['decline'])) {
  setcookie('accept', '0');
  exit();
}
?>

和表格:

<form action='' method ='post'>
<ul>
    <li> <input type= 'radio' name = 'accept' value = 'accept' /> I accept </li>
    <li> <input type= 'radio' name = 'decline' value = 'decline' /> I decline </li>
    <li> <input type = 'submit' value = 'Submit' name = 'submit' /> </li>
</ul>

我的第一篇文章可能不够清楚:

我想用它的网站是WP上托管的webcomic。漫画有“成熟”的内容(暴力,语言,我只想使用cookie作为一种机制让读者“同意”他们将要查看这样的内容。是的,我考虑使用$ _SESSION要做到这一点,但在这种情况下,如果有人愿意“伪造”他们愿意查看这些内容,我可以更少关心他们是否可以访问cookie。

至于安全问题,我只是想确保我的表单是安全的,而不是打开我的网站以获得某种简单的利用。

2 个答案:

答案 0 :(得分:3)

任何敏感信息都不应存储在cookie中,包括安全/权限标记。

不要使用cookie,而是查看sessions,它不会在客户端存储数据(因此在操纵手的范围之外)。这本身并不完全安全,但这是一个完全不同的讨论。

答案 1 :(得分:1)

请改用sessions。会话信息存储在Web服务器上,而不是本地客户端上。

<?php
sessions_start();
if(isset($_POST['accept'])) {
  $_SESSION['accept'] = TRUE;
}

就引荐来源而言,HTTP_REFERER不会通过SSL保留(如果您的表单正在收集敏感信息,那么您应该这样做。)

如果您使用SSL,可以执行以下操作:

  • 页面链接到您的表单:
    <a href="myform.php?r=<?=urlencode("http://your.url")?>">My form</a>

  • 您的表单会添加隐藏的输入,其值为r
    <input type="hidden" name="r" value="<?=$_GET['r']?>" />

如果你没有通过SSL(不推荐),你可以这样做:

  • 您的表单会添加隐藏的输入,其值为HTTP_REFERER
    <input type="hidden" name="r" value="<?=urlencode($_SERVER['HTTP_REFERER'])?>" />

无论哪种方式,您的POST脚本都会使用r的POST值来重定向:
header("Location: ".urldecode($_POST['r']));

然后,您可以检查域中任何其他页面上的会话变量:

<?php  
session_start();
if($_SESSION['accept'] == TRUE) {
  //they have access
}
?>