【问题标题】:How to Prevent Direct Access to a php file that is generating Image如何防止直接访问生成图像的 php 文件
【发布时间】:2012-11-10 08:31:10
【问题描述】:

我有一个生成图像的 php 文件,它被包含在图像标签中,如下所示:

<img src"generate_contact.php?memberid=3456">

现在,如果有人尝试使用 memberid 查询字符串直接访问此文件,他们将实际看到正在生成的图像文件。

如何防止直接访问 "generate_contact.php"

注意:如果我尝试在插入此 img 标签的文件中创建一个 CONSTANT,generate_contact.php 是否可以访问该 CONSTANT?询问是因为 generate_contact.php 没有被包括在内。它仅作为图像标签中的 src 添加。

问候

【问题讨论】:

  • “可以看到正在生成的图像”是什么意思?通过将其放入 img src URL,人们必须“直接”访问它,否则他们看不到图像。
  • 意味着:如果我像mysites.com/generate_contact.php?memberid=3456 一样访问它,他们将能够直接看到图像,然后垃圾邮件发送者可以破解它并填充联系人.. 我生成的图像是用户的联系人 ID
  • 这个问题已经在 SO 上回答了很多次,而且不仅如此。

标签: php image


【解决方案1】:

为什么不使用唯一的哈希而不是使用增量成员 ID 来访问此图像?

在您的成员表中,添加一个“哈希”字段,并在该字段中为每个成员添加一个随机字符串。

我习惯用这种方式生成 10 个字符散列:

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

之后,使用您的哈希来识别您的成员:

<img src = "generate_contact.php?memberhash=0qxv(...)"/>

这样,爬虫将无法增加 id 并获取整个成员的关联联系人。

【讨论】:

  • 这使得人们很难猜测成员 id 来获取图像。
  • 这似乎是一种安全的方法。我会试试这个。谢谢你的朋友
  • @user 这是混淆,而不是安全。混淆对于简单地使自动抓取所有图像变得困难很有用。如果你需要真正的安全,你需要在输出图像之前进行授权检查。
  • @Ninsuo 你使用的方法总是会生成唯一的key?
  • 你会建议什么样的身份验证? @deceze .. 有什么例子吗?
【解决方案2】:

用户浏览器请求将图像放置在页面内是一个“获取”请求,与您直接输入地址相同。没有办法将图像实际放置在页面上,然后使其完全无法访问,除非当然使用 Flash

【讨论】:

    【解决方案3】:

    好的,退一步。

    这都是关于 URL 的。如果您将 URL 放入图像元素的 src 属性中,则该图像必须在该 URL 中可用:

    <img src="/img/profile/42.jpg">
    

    浏览器将下载带有此图像元素的 HTML 文档,然后像第一个请求一样向该 URL 发出 另一个 HTTP 请求以下载图像。

    您可以将该 URL 直接放入浏览器的地址栏中以获得相同的效果。某些 URL 上提供了某些内容。如何访问该 URL 并不重要。它不是“绑定到 HTML 文档”或“秘密”或“隐藏”或类似的东西,因为它在 HTML 文档中。

    网址始终是公开的并且可以“直接”访问,否则没有人可以看到它们的内容。

    因此,您的 URL generate_contact.php?memberid=3456 要么吐出图像,要么不吐出。它在幕后做什么是无关紧要的。

    【讨论】:

    • 你不能检查一下referer之类的吗?
    • @marvin 你可以,但这几乎没有任何保护作用。如果 OP 担心“黑客”,那么referer 检查就是一种可笑的“防御”。
    • 哦,我还以为是包含img标签的页面/url,如果不是他所期望的,他可以阻止它。
    【解决方案4】:

    没有办法阻止直接访问您想要显示给用户的图像。通过拥有:

    <img src = "generate_contact.php?memberid=3456">
    

    您已经为他们提供了直接访问权限,因为一旦页面加载完毕,用户的浏览器实际上会对文件发出 GET 请求。试图阻止直接访问您希望向用户显示的图像违反了 Internet 的基本原理,即用户请求公共文档。

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 1970-01-01
      • 2016-06-28
      • 2023-02-16
      • 2016-03-04
      • 2010-09-29
      • 2019-09-20
      相关资源
      最近更新 更多