防止流量绕过登陆页面

时间:2016-11-16 23:27:20

标签: php html mysql .htaccess http-redirect

我有一个网站,当访问者登陆多个目标网页(不同语言)中的任意一个时,他们有机会在表格中输入任意数量的促销代码。如果他们输入了一个正确的代码(存储在SQL表中),他们会转到另一个页面,其中包含一个表单,他们可以通过该表单提供他们的邮件信息以获得免费产品。如果他们输入的代码不在桌面上,他们会收到一条消息,他们输入的代码无效且被阻止。

这可以通过php工作。输入并提交登录页面表单后,会生成如下URL:website.com/formentry.php ?promo = code,其中' code'匹配用户在表单中输入的内容。如果“代码"匹配数据库表中代码列中的字符串,它们将被发送到条目表单。如果没有,则会被阻止。到目前为止,一切都很好,并且已经运行了好几个月。

但最近发现了一个问题:可以通过将website.com/formentry.php?code=code直接输入浏览器的网址字段来规避目标网页。这是一个问题有几个原因,我需要防止它成为可能。

有没有人对解决方案有任何想法;也许使用.htaccess文件将这些URL请求发送回登录页面?

3 个答案:

答案 0 :(得分:0)

不是通过网址传递促销代码,而是通过sessions

答案 1 :(得分:0)

使用会话,您可以在用户在目标网页上输入正确的代码时设置会话:

session_start();
$_SESSION[valid_user] = true;

然后,在每个其他页面(非登陆页面)上,您放置一个验证器,如:

if (!$_SESSION[valid_user])
{
  echo "You do not have permission to view this page";
}

或者,您可以将用户重定向到另一个页面,而不是显示错误消息:

if (!$_SESSION[valid_user])
{
  $url = "http://example.com";
  header("Location: $url");
  exit();
}

如果你想更进一步,那就让我们说吧。代码为420.您可以设置目标网页以获取提交的代码并设置

$_SESSION[420] = true;

并在产品#420的页面上,或者其他任何内容,如上所述验证用户的会话包含420 == true。这样,如果他们使用优惠券代码420,他们只被授权查看产品#420的页面,而不是所有产品页面。

答案 2 :(得分:0)

您可以解决此问题,同时保护您自己免受跨站请求伪造(CSRF)的侵害。

以下是:

  • 生成哈希,guid或类似的东西(使用random_bytes是一个不错的选择)。
  • 在会话中保存此哈希值。
  • 然后在表单的隐藏字段中添加哈希值。
  • 在表单中使用POST方法代替GET。
  • 在接收请求的页面中,将给定的哈希值与会话中的哈希值进行比较,如果不匹配或不存在,则抛出错误。

在很多方面,这可以为您提供更好的保护。

您可以使用的一些示例代码。

<?php
// In the page you have the form:

// Generate the string
$csrf_value = str_replace(['/', '+', '='], '', base64_encode(random_bytes(20)));
// Save it in the session
$_SESSION['csrf'] = $csrf_value;
?>

<form action"a_page.php" method="POST">
    <input type="hidden" name="csrf" value="<?php echo $csrf_value ?>" />
    <input type="textfield" name="code" />
</form>

在收到请求的页面中:

<?php
if (isset($_POST['csrf']) 
        && strlen($_POST['csrf']) > 0 
        && strcmp($_SESSION['csrf'], $_POST['csrf']) === 0) {
    // All good, do your thing
} else {
    // Show error, this guy is trying to trick you
}