如何保护 WebFonts [关闭]

Posted

技术标签:

【中文标题】如何保护 WebFonts [关闭]【英文标题】:How to protect WebFonts [closed] 【发布时间】:2011-09-25 07:04:08 【问题描述】:

我有一个客户想在他自己的服务器上托管他的网络字体。我有一个 font.com 帐户,直到现在为止托管了该字体。我说实话fonts.com agreement(第 18 点。)他们说你可以在自己的服务器上托管文件,但你必须尽可能地保护它们。

我能想到的唯一方法是在.htaccess 中使用HTTP_REFERER 限制对这些文件的请求。

我可以采取更多措施来保护这些字体吗?赚更多有什么意义吗?你认为这是一个足够的保护吗?

我个人不相信技术复制保护,您总是可以以某种方式复制您可以看到的内容。但我不希望我的客户陷入法律纠纷。你有这方面的经验吗?

编辑

我也对法律方面感兴趣。如果有人可以下载字体并重用它,会发生什么?他们的意思是我只需要保护字体免受热链接或下载吗?

【问题讨论】:

我投票结束这个问题,因为它是关于法律建议,而不是编程建议。 @durron597 在创建 4 年后,无论如何 :D 法律方面只是奖金问题。实际上,它是关于技术方面的。我该怎么做才能更清楚地说明这一点? 【参考方案1】:

HTTP_REFERER 和 USER_AGENT 很容易被欺骗。话虽如此,如果您想防止热链接,那么 HTTP_REFERER 是一个很好的开始,可以将其限制为来自您自己的应用程序的调用。

使用 Apache mode_security

SecFilterSelective "HTTP_REFERER" "^[^\?]*mydomain\.com"

将上述内容添加到带有字体的目录将拒绝来自其他站点的所有不合规请求。

为了提高安全性,当有人使用您的应用程序时,您在服务器上给他们一个会话(例如 php),并在那里存储一个 uniqueId。

<?PHP
// #header.php - in the head of the page that uses the font
// ...
if( !isset( $_SESSION['uniqueId'] ) ) 
    $_SESSION['uniqueId'] = rand( pow(2,16), pow(2,31) );

$uniqueId = $_SESSION['uniqueId'];

echo '<script type="text/javascript" src="http://foo.com/getFont.php?u='.$uniqueId.'"></script>';
?>

这为字体服务。

<?PHP
// #getFont.php - serve your fonts from here
// ...
if( !isset( $_GET['u'] ) || !isset( $_SESSION['uniqueId'] ) || $_SESSION['uniqueId']!=$_GET['u'] ) 
    die('Bad Request');


// cat out the file contents here for the request font file
?>

然后,您为您的字体引用一个动态页面(例如 getFont.php?uniqueId=foo),并且仅当 unqiueId 与他们的会话匹配时才返回字体文件,否则您认为它是一个欺骗性的引用热链接。这与将文件放在仅经过身份验证的用户的目录中基本相同,但只有在用户登录时才有效,而上述方法只是要求用户在加载字体之前加载页面,以防止热链接.

【讨论】:

这不是在回答我的问题。我想知道可以做什么。 你问这种方法是否有意义,我同意了。使用像 mod_security 这样的模块并将像 'SecFilterSelective "HTTP_REFERER" "^[^\?]*mydomain\.com"' 这样的过滤器应用到带有字体的目录将拒绝所有不符合要求的请求其他网站。 是的,但你说的是一个好的开始,那么接下来呢? :) 当有人使用你的应用程序时,你在服务器上给他们一个会话(比如 PHP),然后你在那里存储一个 uniqueId。然后,您为您的字体引用一个动态页面(例如 getFont.php?uniqueId=foo),并且仅当 unqiueId 与他们的会话匹配时才返回字体文件,否则您认为它是一个欺骗性的引用热链接。这与将文件放在仅经过身份验证的用户的目录中基本相同,但只有在用户登录时才有效,而上述方法只是要求用户在加载字体之前加载页面,以防止热链接. 啊,太好了,如果你把这个放在你的答案中,你至少会得到 +1。【参考方案2】:

这是一个混合目标 - 保护文件不被复制,同时为每个人提供文件的副本。就找到中间立场而言,Twisted Pear 的答案可能是最好的。

如果您想保护文件,则在服务器上将文本渲染为图像。

从法律上讲,您可以针对托管您的字体文件的网站调用 DMCA。

【讨论】:

我唯一想要的就是尊重 font.com 协议,不使用图像......那么使用 web-fonts 会有什么好处......【参考方案3】:

见https://bugzilla.mozilla.org/show_bug.cgi?id=540859

显然由 FontShop 批准(最后评论)并由 MyFonts 建议 (http://twitter.com/#!/MyFonts/status/98767132321521664)。

编辑:我猜这是comment 26中提到的解决方案:

RewriteCond "%HTTP_HOST_%HTTP_REFERER" "!\.?([^\.]+\.[^\.]+?)_https?://.*\1/.*$"
RewriteRule \.(woff|eot)$ - [F,NC,L]

【讨论】:

很难找到合适的帖子。如果您可以添加与您的答案相关的报价,您至少会得到我的 +1 并且可能是正确的答案。【参考方案4】:

您会在 typekit 的文章中找到一些有趣的方法:"Serving and Protecting Fonts on the Web"

他们使用 HTTP Referrer 检查、base64 编码、分段等方法。然而,这些都没有提供完整的保护,有人同意文章中的这一说法:

事实是,要在浏览器中显示某些内容,它必须在网络上。如果它在网络上,则无法完全保护它……我们自己设置了一些障碍。我们的目的只是为了阻止随意滥用,并明确表示从 Typekit 获取字体是一种明确且有意的行为。

要承担的第二件事是,被许可人可以随时无视协议,这就是为什么像 Adob​​e 这样生产最优秀字体的公司在Font licensing page 中声明了包括网络在内的使用条款。

另请参阅 W3 CSS3 网络字体规范中讨论的 Font Licensing Issues。

【讨论】:

【参考方案5】:

不是 Apache 方面的专家,但我们使用过它,它似乎运行良好:

Options -Indexes
IndexIgnore *.woff *.eot
RewriteEngine On
RewriteCond %HTTP_REFERER !^http://(www\.)?yoursite\.com/.* [NC]
RewriteCond %REQUEST_URI !hotlink\.(woff|eot) [NC]
RewriteRule .*\.(woff|eot)$ http://yoursite.com/ [NC,F,L]

直接下载会导致 403,但仍然可以通过您自己网站的 CSS 访问文件。

【讨论】:

以上是关于如何保护 WebFonts [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在锁定的 Intranet 中使用 google webfonts?

您如何查看 EOT webfont 文件? [关闭]

ASP.NET 应用程序 - Webfonts 在用户登录到站点之前不会加载

Webpack“找不到模块:错误:无法解析'../webfonts/fa-solid-900.eot'”

html 添加google webfonts

Webfonts 在 Windows、Mac 和 Linux 上呈现不同