2014-02-12 111 views
0

我有一個重定向一個img src屬性一個PHP頁面nginx的重寫規則。在這個php頁面中,我試圖做一個GET請求,它在成功時向同一個頁面發出POST請求,並將GET請求返回的數據作爲數據發送。爲什麼PHP腳本中的$ _POST數據爲空?如果我在PHP腳本中對$name = "http://path/to/my/img.png"進行了硬編碼,則圖像正確呈現。

<?php 
ini_set('display_errors',1); 
ini_set('display_startup_errors',1); 
error_reporting(-1); 
var_dump($_REQUEST); 
//if(isset($_POST['val'])) { 


    // open the file in a binary mode 

    $name = $_POST['val']; // ALWAYS EMPTY 
    $fp = fopen($name, 'rb'); 

    // send the right headers 
    header("Content-Type: image/png"); 
    header("Content-Length: " . filesize($name)); 

    // dump the picture and stop the script 
    //echo fpassthru($fp); 
    header("Location: $name"); 
    exit; 

//} 
?> 
<html> 
<head> 
<script type='text/javascript' src='/steal/steal.js'></script> 
<script type="text/javascript" src="/plugins/jquery/json2.js"></script> 
<script type="text/javascript"> 
steal('jquery/dom/fixture').then(function(){ 

$.fixture("GET /event/{code}", function(original, settings, headers){ 
    return [200, "success", { "img_url":"http://path/to/my/img.png" }, {} ] 
}) 

var strObj = <?php echo json_encode($_REQUEST); ?>; 
var str = strObj.q; 
var eventCode = str.split('/')[1]; 
$.ajax({ 
    url: "/event/"+eventCode, 
    success: function(data) { 
    var imgUrl = data.img_url 
    $.ajax({ 
     type: 'POST', 
     contentType: 'json', 
     data: {val:imgUrl}, 
     success: function(data){ 
      console.log(data); 
     }, 
     error: function(jqXHR, textStatus, errorThrown){ 
      console.log(textStatus); 
     } 
    }); 
    } 
}); 

}); 
</script> 

</head> 
<body> 

</body> 
</html> 
+4

好起來。你正在嘗試將圖像點的src指向這個php頁面,在你正在輸出javascript的頁面(據稱用戶瀏覽器運行)中,然後將POST請求發送到與它們相同的url剛剛進入GET? – castis

+0

這是用於電子郵件跟蹤。基本上,用戶將收到一封電子郵件,並在打開該電子郵件時,img src屬性向uri發出請求,然後將其重寫爲php腳本。 php腳本接收$ _REQUEST數據 - 包含與用戶綁定的一些id,使用該id發出GET請求,成功時返回一個url。從這裏開始,url被用作POST請求的數據到相同的php頁面,在那裏它將被base64編碼並作爲img src屬性返回。這聽起來也很複雜,所以我願意提供建議。 – neridaj

回答

1

好的,你已經採取了一些可能的措施。

當用戶點擊他們的電子郵件這一形象,一個請求被髮送到您的服務器要求的形象。由於<img>標籤期望的是圖片而不是html文檔,因此沒有一個javascript會將其返回給用戶。您可以通過一些對釘的事情傳出請求像

<img src="http://yourwebsite.com/tracker.php?val=someimage.png"> 

和你的腳本將能夠得到val$_GET,但你將不能夠從電子郵件中作出這一形象POST請求。

所有你在頂部有獲得該$_REQUEST數據?這就是您從中獲取所有電子郵件跟蹤數據的地方。你所能得到的一切,$_GET就是你所得到的。

之後,你需要給他們回的圖像。所以繼承人如何做到這一點。

$val = $_GET['val']; // assuming val contains an image 

header('Content-Type: image/png'); 
readfile('/path/to/your/images/'. $val); 

請超意識到,你需要仔細的檢查$val,以確保其要能夠看到只包含圖像。一個潛在的惡意用戶可以看到這個,並把tracker.php?val=/etc/passwd或類似的東西,然後你有PHP試圖讀取你的密碼文件。確保圖像存在,甚至可以讀取,可以使用is_readable()函數完成。

+0

謝謝。我實際上已經通過在php中做所有事情得到了一點點。我已經成功渲染了圖像,但現在需要渲染一個base64編碼圖像,我不確定這是可能的。 '$ response = http_get(「http://www.google.com」,array(「timeout」=> 1),$ info); //作爲夾具。 $ info ['img_url'] ='http://path/to/my/img.png'; $ img_url = $ info ['img_url']; $ img = file_get_contents($ img_url); $ img_data = base64_encode($ img); header(「Content-Type:image/png」); header(「Location:$ img_url」); //作品 echo「data:image/png; base64,$ img_data」; //不起作用 退出; – neridaj

+0

這裏的問題是,一旦html到達用戶收件箱,它就不能再被修改。在html呈現併發送給用戶之前,您必須回顯base64編碼圖像。這是沒有辦法的。大多數人對跟蹤圖像的處理是將其製作成電子郵件中某個地方的單個像素圖像,以及電子郵件正常內容的其餘部分。 – castis

+0

這就是我的想法。要求是使用實際的公司徽標,因爲增加的電子郵件被1px圖像標記爲垃圾郵件。我無法真正在電子郵件客戶端測試這個,但是,header(「Content-Type:image/png」);頭(「位置:$ img_url」);'部分在電子郵件客戶端工作? – neridaj