簡體   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