2012-11-23 145 views
2

我試圖將PagSeguro(支付網關 - 巴西版本的PayPal)併入我的網站。客戶完成PagSeguro後,他們將數據(通過POST)發送到我指定的功能。但是,我沒有收到POST。在完成所有我能想到的故障排除之後,我聯繫了PagSeguro。他們說他們的日誌表明POST正在正常發送,但他們正在接收HTTP 302響應。無法模擬HTTP 302響應

爲了弄清楚爲什麼發生這種情況,我創建了隱藏值的形式來模擬發送POST到我的功能。我把這個表格放在不同的域名下,以防與它有關。每次我從模擬表單發送POST時,都會收到一個HTTP 200響應,而我的日誌表明POST已收到。

PagSeguro如何接收與我的模擬不同的響應?它可能與服務器有關或與我的腳本有關嗎?

下面是函數(使用笨)其他應當接受POST:

function pagseguro_retorno(){ 
    if (count($_POST) == 0) { 
     return FALSE; 
    } 
    $msg = 'POST RECEIVED'; 
    $simulate = $this->input->post('Simulate'); 
    if (! empty($simulate)){ 
     $result = 'VERIFICADO'; 
     $msg .= ' FROM SIMULATOR'; 
    } else { 
     $this->load->library(PagSeguroNpi); 
     $result = $this->PagSeguroNpi->notificationPost(); 
    } 
    $this->log($msg); 
    if ($result == "VERIFICADO") { 
     $id = $this->input->post('Referencia');//cart id 
     $this->load->model('transacao_model'); 
     $trans_row = $this->transacao_model->get_transaction($id); 
     if (! is_object($trans_row)){ 
      //LOAD NEW TRANSACTION 
      if (! $this->new_transaction($id)){ 
       $notice = "Unable to load new transaction</p><p>"; 
       $this->log($notice); 
       $notice .= '<pre>'.print_r($_POST, TRUE).'</pre>'; 
       $this->email_notice($notice); 
      } 
     } 
     $this->load->model('carrinho_model'); 
     if($_POST['StatusTransacao'] == 'Aprovado'){ 
      $status = 'apr'; 
     }elseif($_POST['StatusTransacao'] == 'Em Análise'){ 
      $status = 'anl'; 
     }elseif($_POST['StatusTransacao'] == 'Aguardando Pagto'){ 
      $status = 'wtg'; 
     }elseif($_POST['StatusTransacao'] == 'Completo'){ 
      $status = 'cmp'; 
      //nothing more happens here - client must click on 'mark as shipped' before cart is removed and history data is loaded 
     }elseif($_POST['StatusTransacao'] == 'Cancelado'){ 
      //reshelf - don't set $status, because the cart's about to be destroyed 
      $this->carrinho_model->reshelf(array($id)); 
     } 
     if (isset($status)){ 
      $this->carrinho_model->update_carrinho($id, array('status' => $status)); 
     } 
    } else if ($result == "FALSO") { 
     $notice = "PagSeguro return was invalid."; 
     $this->log($notice); 
     $notice .= '<pre>'.print_r($_POST, TRUE).'</pre>'; 
     $this->email_notice($notice); 
    } else { 
     $notice = "Error in PagSeguro request"; 
     $this->log($notice); 
     $notice .= '<pre>'.print_r($_POST, TRUE).'</pre>'; 
     $this->email_notice($notice); 
    } 
} 

安全更新:

張貼後,我很快就意識到,我是開自己交給了黑客攻擊。該功能必須是公開的,所以任何知道該功能名稱的人都可以訪問它併發布「模擬」以便立即進行驗證。然後他們可以傳遞他們想要的任何數據。

我改變了函數的名字的東西,是不可能的猜測,而當沒有在生產模式,我已禁用的模擬選項。

+0

您是否嘗試過記錄請求以確保PagSeguro實際上正在請求正確的頁面?最好確定一下。 –

+0

我不知道你的意思是如何記錄請求,但毫無疑問,他們正在請求正確的頁面。我已經多次驗證了該網址。 –

+0

我的意思是在Apache日誌,谷歌分析,你的PHP應用程序,無論你想要的。使用HTTP_REFERER,請求的URL和GET/POST參數將每個請求寫入日誌文件,以確保它是正確的。如果你* 100%肯定*他們正在請求正確的URL,正確的參數,然後從來沒有 - 但我會犯錯謹慎的一面,只是確保。 –

回答

0

的問題是,我的CSRF保護導致重定向時使用POST不發送正確的CSRF代碼。我的模擬器正在工作,因爲我複製了我在該網站上製作的動態模擬器生成的HTML。然後,我粘貼HTML創建一個靜態模擬器,並將其放在不同的URL下。除了HTML之外,我還無意中粘貼了CSRF代碼。靜態模擬器工作正常,直到代碼過期。幾次之後,我放棄了使用它,所以直到今天我才發現它不再有效。

我知道這個確切的情況可能不會再在接下來的500年內陸續發生,但如果不是因爲函數接收POST禁用之類的東西CSRF安全性可能會導致類似的東西支付網關的問題。