ajax发布请求php $ _POST vars为空

时间:2014-02-12 00:59:53

标签: php jquery ajax nginx

我有一个nginx重写规则,将img src属性重定向到php页面。在这个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>

1 个答案:

答案 0 :(得分: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()功能完成。