0

我正在尝试制作一个包含一些媒体内容的网站,我想以各种方式保护这些内容。我知道你永远不可能 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 文件才能使其工作。

编辑:问题图片: 我的问题图片 - tinybox 中的 php 图像

4

2 回答 2

0

您可以使用在哈希和图像 ID 之间建立关系的数据库来混淆您的 ID。

而不是 put 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)显示它。

希望这可以帮助。

于 2013-03-03T08:14:09.670 回答
0

尚不清楚您希望传递给 PHP 的这个变量到底做什么。我假设您只是想指出您想要的图像,或者某种用户标识符等......

如果你想将这样的变量传递给 PHP,你可以使用querystring请求的 。(适用于GET请求)

例如,您可以<img>使用以下内容创建一个元素srchttp ://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=从第一个块开始),请确保您没有传递文件在磁盘上的位置,否则足够精明的用户可以制定一个请求,使您的脚本发送他们选择的任何文件。相反,我建议使用某种标识符,例如?image=123456.

这将允许您将此脚本的 url 用作<img>元素,如下所示:

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

编辑

如果你真的不想使用 GET,你可能会使用 jQuery 和 AJAX 来加载图像。然后,您可以向服务器创建一个 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

于 2013-03-02T21:31:23.663 回答