微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

例如,page1提交的值中的ajax为page2.PHP?q = abc,而page2仅在从page1提交时接受q.

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

有可能吗?

编辑1:

因为我可以访问page2并获得结果.不要提及会话,因为我可以验证会话以满足我的需求,提交给PHP的值是否有效.

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

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

解决方法:

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

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

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

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);
}

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

你的AJAX函数就像:

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

无论你是否想要使用$_GET或$_POST方法.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐