仅接受来自特定页面的AJAX $ _GET或$ _POST请求

Chi*_*hin 3 php ajax

是否可以检查是否从特定页面提交了这些$_GET或者$_POST值?

例如,有一个ajaxpage1提交的价值page2.php?q=abc,而page2只接受q当它从提交page1.

如果我直接浏览到该页面page2.php?q=abc,php除非我提交了值,否则不会运行page1.

有可能吗?

编辑1:

因为我可以访问page2并获得结果.不要提及session,因为我可以验证session匹配我的需求,提交给php的值是否有效.

我想要的是检查请求是否从特定页面发送.如果为true,则接受值并处理它,否则,重定向到主页或其他内容.

编辑2:我的问题是,不仅是通过Ajax提交的值,还有直接访问,例如href="page2.php?q=abc".我想令牌将是最好的方法,查询部分将再次验证.

AyB*_*AyB 6

在处理AJAX时,您可以执行两项安全检查:

1)检查它是否通过AJAX发送的请求:

if ( !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest' )
{
       //AJAX Request Detected
}
Run Code Online (Sandbox Code Playgroud)

2)散列令牌:

在持有AJAX请求的页面上,创建一个令牌:

session_start();
$hashed='';
$_SESSION['token'] = microtime(); 
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
    $salt = '$2y$11$' . substr(md5(uniqid(mt_rand(), true)), 0, 22);
    $hashed = crypt($_SESSION['token'], $salt);
}
Run Code Online (Sandbox Code Playgroud)

这是使用blowfish带有crypt()的算法来创建散列字符串.

你的AJAX函数就像:

$.ajax({
    type: "POST",
    url: 'page2.php',
    data: {
        action: '<?php echo $hashed;?>', //pasted the hashed string created in PHP
        q: 'test'
    },
    success: function (data) {}
});
Run Code Online (Sandbox Code Playgroud)

无论您是想使用$_GET还是$_POST方法,都可以使用.

然后在接收AJAX请求的第二页上,您执行以下操作:

session_start();
if(crypt($_SESSION['token'], $_POST['action']) == $_POST['action']){
   //Hashed string matches. Request has come from page1.
   echo $_POST['q'];
}
Run Code Online (Sandbox Code Playgroud)