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

时间:2014-05-08 04:54:21

标签: php ajax

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

例如,ajaxpage1提交的值为page2.php?q=abc,而page2仅在q提交page1时才接受page2.php?q=abc {1}}。

如果我直接浏览到php页面,除非我从page1提交了值,否则page2将无法运行。

有可能吗?

编辑1:

因为我可以访问session并获得结果。不要提及session,因为我可以验证href="page2.php?q=abc"以符合我的需要,并且提交给php的值是否有效。

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

编辑2: 我的问题是,不仅是通过Ajax提交的值,还有直接访问,例如{{1}}。我想令牌将是最好的方法,查询部分将再次验证。

3 个答案:

答案 0 :(得分:6)

在处理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);
}

这是使用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) {}
});

是否要使用$_GET$_POST方法。

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

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

答案 1 :(得分:1)

在表单中

,您只需添加隐藏字段并添加页面ID即可。在应发送帖子或获取请求的页面上,您可以执行类似

的操作
<form action='phpscript.php'>
    <input type='hidden' name='page' value='valid_page'>
    <input name='your_other_info'>
</form>

在phpscript.php中,您可以执行类似

的操作
<?php
    //If you have a request, it can be either post or get method
    if(isset($_SERVER['REQUEST_METHOD']) && (isset($_POST['page']) || isset($_GET['page']))){

    }else{
        //Post or get is not from the valid page
    }
?>

答案 2 :(得分:0)

你不能限制&#34;起源&#34;请求,因为本身没有这样的事情。你的&#34;页面&#34;没有发送请求,它是执行它的浏览器。浏览器可能有多种原因可以向您发送请求;是因为你的一个页面已经指示它这样做,或者是因为用户正在手动摆弄Javascript控制台。

你得到的只是一个HTTP请求。来吧,检查一下。在浏览器中,查看网络选项卡并检查正在发送的原始请求。它只是一堆HTTP标题,仅此而已。任何人都可以随时随地发送带有任意HTTP标头的HTTP请求,并使其看起来像他们想要的任何内容。即使是Referer HTTP标头也不会保护&#34;保护&#34;你。

如果您需要任何类型的保护,您可以使用会话令牌或用户身份验证来限制可以稍微发送查询的潜在实体集。但是你所拥有的仍然是一个公共URL端点,它可以回答任意HTTP查询。您不能限制他们的原始页面&#34;。您可以做的最好的方法是通过要求设置某些标头来对其进行模糊处理(如Referer或X-Requested-With)。