簡體   English   中英

第二次調用 jquery 時出現 403 AJAX 錯誤

[英]Getting 403 AJAX error on second call jquery

我有一個簡單的表單,其中包含 select 個客戶字段。 一旦您 select 成為客戶,我就會撥打 ajax 來獲取客戶徽標並顯示在 select 字段下方供用戶查看。 這很好用。 AJAX 請求如下所示:

$.ajax({
  url: '/clients/access_controls/<?php echo basename(__FILE__);?>',
  type: 'post',
  data: clientId,
  //dataType: 'application/json',
  //contentType: 'application/x-www-form-urlencoded',

  error: function(jqXhr, textStatus, errorMessage) {
    alert('ERROR MESSAGE: ' + errorMessage);
    return false;
  },

  success: function(d) {
    $(d.html).insertAfter(tab.find('table tr:eq(0)'));
    var func = d.responseScript;
    if ($.isFunction(eval(func))) {
      eval(func + '()');
    }
  }
});

問題是,一旦我 select 列表中的另一個客戶端,Ajax 調用將返回錯誤 403 FORBIDDEN。 可能是什么問題? 令我困惑的是第一次調用正常,為什么第二次失敗了。 這是一個非常簡單的問題,但我無法修復它。 我已經嘗試使用請求設置不同的內容類型,還嘗試在處理請求的 PHP 文件上設置“訪問控制”標頭,如下所示:

header('Content-type: application/json');
//header('Access-Control-Allow-Headers', 'api-key,content-type');

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
//header('content-type: application/x-www-form-urlencoded; charset=UTF-8');

無濟於事。 任何幫助將不勝感激。 提前致謝。

這是 php 代碼

if (isset($_POST['request'])) {
  if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    header('Content-type: application/json');
    //header('Access-Control-Allow-Headers', 'api-key,content-type');

    //header('Access-Control-Allow-Origin: *');
    //header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
    //header('content-type: application/x-www-form-urlencoded; charset=UTF-8');

}

switch ($_POST['request']) {
    case 'logos':
        if (!isset($_POST['sub'], $_POST['value'])) {
            echo json_encode([
                'error' => 'Invalid arguments'
            ]);
            exit;
        }

        $logo = getClientLogo($_POST['value']);
        $html = '<tr><td valign="top">Current Logo:</td><td valign="top" class="client_logo">' . ((!empty($logo)) ? $logo : '<strong>No Logo</strong>') . '</td></tr><tr><td>Upload new logo:</td><td><form method="post" enctype="multipart/form-data" target="member_image" action="/clients/access_controls/' . basename(__FILE__) . '"><input type="file" name="member_image" class="hidden" /><input type="button" value="Select File" data-usage="member_image" data-event="click" data-label="member_filename" />&nbsp;&nbsp;<span class="member_filename">No file selected</span>&nbsp;&nbsp;<input type="submit" value="Upload &amp; Save &gt;" /><input type="hidden" name="request" value="image_upload" /><input type="hidden" name="value" value="' . $_POST['value'] . '" /><input type="hidden" name="iil_token" value="' . getCSRFToken() . '" /></form><input name="member_image" style="display: none;" /></td></tr>';
        print json_encode([
            'html' => $html,
            'responseScript' => 'IIL.applyImageUploadRequirements'
        ]);
        exit;

如果您有 Mod Security - 嘗試將其關閉並查看是否有效。 我最近在從 ajax 調用 php 腳本時遇到了 403 錯誤 - 如果內容包含單詞“include”,它會給出 403。 關閉 mod-security 使其正常工作,直到我們發現有問題的規則。

對於任何可能發現這有益的人,@Dylan Hamilton-Foster 我會說你很接近 - 因為,這是一個安全檢查問題。 但是,我的具體情況很獨特。 事情是這樣的; 在我們的內部框架中,我們在提交每個表單時觸發從同一頁面生成的 csrf 代碼,並在處理腳本中檢查它。 當一個人第一次訪問該頁面時,會發送 csrf 代碼,因此它會匹配並允許請求通過。 但是因為第二次提交表單時沒有刷新頁面,所以沒有發送csrf,所以處理端的csrf驗證腳本拒絕了請求。

我的解決方案基本上是設置一個計數器變量並將其與每個請求一起發布(與 csrf 令牌一起),然后在后續請求中遞增它。 在處理腳本中,我修改了令牌驗證以接受計數器變量(如果存在)。

我知道這是不安全的並且違背了使用 CSRF 令牌的目的,但是

a) 這個應用程序只在內部使用,並且在我們公司的防火牆之內

b) 這是一個遺留應用程序,多個其他內部應用程序使用相同的腳本,所以我想盡可能減少更改。

你是 go。它運作良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM