使用动态生成的imagejpeg - FORM POST的替代方案

时间:2013-03-02 18:33:58

标签: php variables gd

我正在尝试创建一个包含某些媒体内容的网站,我希望以各种方式保护这些内容。我知道你永远不会100%,但我希望能够通过imagejpeg提供图像,所以我不向观众提供媒体地址的实际地址以及无法复制地址并以这种方式看图像。

主要是隐藏实际的媒体链接地址。

我像这样输出图像NEW_SIZE_IMAGE.PHP / NEW_SIZE_IMAGE_THUMB.PHP:

    // Content type
    header('Content-Type: image/jpeg');

    // Output
    imagejpeg($thumb);

由于标题的性质,我只能在iframe中执行此操作。 使用iframe我遇到了将动态变量传递给页面的问题,因为这不是POST。 图像在页面上的单独iframe中加载。

所以这是我的拇指图片的问题,然后我对高分辨率图片有类似的问题,我通过小盒子运行。

我像这样MAIN_SITE.PHP运行图像导航:

    <a onclick="TINY.box.show({url:'../image_holder_pop.php',width:800,height:600})">
    <iframe width="300" height="200" src="../new_size_image_thumb.php"></iframe>
    <br />
    <h2><br />HIGH RES LINK</h2></a>

IMAGE_HOLDER_POP.PHP

   <iframe width="800" height="600" src="../new_size_image.php"></iframe>

我需要将一个变量传递给new_size_img.php / new_size_img_thumb.php文件才能生效。

编辑:问题图片: picture of my problem - php image in tinybox

2 个答案:

答案 0 :(得分:0)

有些不清楚您希望传递给PHP的变量到底是什么。我假设您只想表明您想要的图像,或者某种用户标识符......

如果要将类似的变量传递给PHP,可以使用请求的querystring。 (适用于GET个请求)

例如,您可以使用以下<img>创建src元素:http://example.com/new_size_image.php?image=imagename&otherparam=1&otherparam2=2

其中imagename是图像的标识符,而otherparam1和2是可选参数。您可以在PHP中访问这些变量,如下所示:

$imagename = $_GET['image'];
$otherparam = $_GET['otherparam'];
$otherparam2 = $_GET['otherparam2'];

然后您可以使用它来确定向客户提供的图像。

接下来,我很困惑为什么你认为你需要iframe。他们不会混淆任何东西或阻止用户复制链接。更好地使用图像 - 您只需要设置正确的标题。例如,尝试使用$filename作为参数的函数,该参数是要加载的图像的路径。

function outputImage( $filename ) {
    header('Content-Description: File Transfer');
    header("Content-type: image/jpeg");
    header('Content-Disposition: attachment; filename='.basename($filename ));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($filename ));
    ob_clean();
    flush();
    readfile($filename );
    exit;
}

(这是来自相关问题:URL to a random image

关于安全性的说明:如果您使用查询字符串传递您想要的脚本(也就是第一个块中的?image=),请确保< strong>不会在磁盘上传递文件的位置,否则一个足够精明的用户可以制定一个请求,使您的脚本发送他们选择的任何文件。相反,我建议使用某种类型的标识符,例如?image=123456

这样您就可以将此脚本的url用作<img>元素,如下所示:

<img src="http://example.com/new_size_image.php?image=imagename&otherparam=1&otherparam2=2" width="300" height="200" />

修改

如果你真的不想使用GET,你可能会使用带有AJAX的jQuery加载图像。然后,您可以向服务器创建一个POST请求,该请求将返回base64编码的图像,然后将其插入页面中。这意味着<img>标记实际上不包含图像URL,而是包含原始base64编码数据。不是很干净,但有些混淆。

要使用jQuery和AJAX加载图像,请查看此响应:https://stackoverflow.com/a/12714338/747811

如果采用这种方法,我建议将图像存储为base64编码文件,而不是每次提供图像时计算其编码。要使用以下内容对图像进行编码:http://www.freeformatter.com/base64-encoder.html

要在PHP中对其进行编码,请使用base64_encode()http://php.net/manual/en/function.base64-encode.php

答案 1 :(得分:0)

您可以使用数据库对您的ID进行模糊处理,该数据库可以构建哈希与您的图片ID之间的关系。

而不是放new_img.php?id=123,你会new_img.php?hash=0guww7g4ow,就像在Youtube上一样。

您需要在当前图像表中添加一列hash(假设您使用ID时已经有一列),并且您需要为每个现有图像创建一个哈希值。

要在基数36中生成10个字符的散列(10 ^ 36种组合,我认为这已经足够了),我习惯了:

$hash = substr(str_shuffle(base_convert(str_shuffle(sha1(str_shuffle(md5(rand() . microtime())))), 16, 36)), 0, 10);

然后,创建一个reader.php,将哈希作为GET参数,并使其处理哈希与图像之间的关系。最后,使用imagejpeg(甚至更简单,readfile)显示它。

希望这有帮助。