2014-02-12 81 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