我有一个为许多图像服务的项目。该项目还具有一个API,它不仅提供图像链接,而且还提供图像链接。
我希望有一种方法,成功地避免刮我的图像。我不介意用户可以单独下载每个图像,但不希望有人同时刮掉所有的图像,以避免高带宽的使用。
我认为使用htaccess拒绝直接访问图像文件夹。另外,考虑在PHP (在网站中)使用动态链接来显示图像(例如loadimage.php?id=XXXXX),这样我的用户就不知道完整的图像链接了。
我怎样才能在API (甚至在网站上)做到这一点,以防止刮擦?我想一些类似于令牌的东西,每个请求都会生成一个新的“图像id",但是或者我遗漏了一些东西,或者我想不出如何使它工作。
我知道这是不可能有一个100%有效的方法来做,但任何建议,如何困难,将不胜感激。
谢谢。
发布于 2019-10-24 18:56:29
你在找一个利率限制政策。它包括跟踪请求图像的次数(或交换的字节数),并在超过阈值时发出(通常是) 429 Too Many Requests响应。
Nginx有一些相当好的内置工具来限制利率。您提到了.htaccess,这意味着Apache,其中也有一个速率限制模块。
无论使用PHP还是不使用PHP,您都可以这样做。您可以识别希望限制费率的URL模式,并将速率限制策略应用于该URL模式(可以是PHP脚本,也可以是某个目录)。
对于Apache:
<Location ".../path/to/script.php">
SetOutputFilter RATE_LIMIT
SetEnv rate-limit 400
SetEnv rate-initial-burst 512
</Location>或者,您可以在PHP中编写将访问写入数据库的代码,并根据给定窗口期间的访问次数强制限制。
当web服务器本身支持这样好的工具时,我通常不会建议编写自己的工具。一个例外情况是,如果在一个集群中使用多个web服务器,则无法轻松同步整个服务器的限速阈值和计数。
https://stackoverflow.com/questions/58547353
复制相似问题