繁体   English   中英

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

[英]Only accept AJAX $_GET or $_POST requests from specific page

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

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

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

有可能吗?

编辑1:

因为我可以访问page2并获得结果。 不要提及session ,因为我可以验证session以满足我的需求,提交给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'];
}

在您的表单中,您只需添加隐藏字段并添加页面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
    }
?>

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM