如何保护Web字体

16

我有一个客户希望将Web字体托管在自己的服务器上。直到现在,这种字体一直是托管在我的font.com账户上。我查看了fonts.com协议(第18点),他们说,你可以将文件托管在自己的服务器上,但必须尽可能好地保护它们。

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

我能做更多来保护这些字体吗?做得更多是否有意义,你认为这是足够的保护吗?

我个人不相信技术上的复制保护,你总是可以以某种方式复制你能看到的东西。但我不想让我的客户陷入法律麻烦。您有这方面的经验吗?

编辑

我对法律方面也很感兴趣。如果有人可以下载字体并重复使用它会发生什么?他们是指我必须仅从防止热链接还是从下载字体中保护字体?


4
我建议关闭这个问题,因为它涉及法律建议而非编程建议。 - durron597
@durron597 创立4年后,无论如何 :D 法律方面只是额外的问题。实际上,重点在于技术方面。我该怎么做才能让这更清晰明了? - meo
5个回答

16

HTTP_REFERER和USER_AGENT都很容易被伪造。尽管如此,如果您想要防止热链接,则使用HTTP_REFERER是一个不错的开始,以限制仅从您自己的应用程序调用它。

使用Apache mode_security

SecFilterSelective "HTTP_REFERER" "^[^\?]*mydomain\.com"
将上述内容添加到字体所在的目录中,将拒绝来自其他网站的所有不符合规范的请求。
为了增加安全性,在某人使用您的应用程序时,您在服务器上为他们创建一个会话(例如在PHP中),并在那里存储唯一标识。
<?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),仅当uniqueId与其会话匹配时,才返回字体文件,否则您假设它是伪造的引荐网页热链接。这与将文件放置在经过身份验证的用户目录中基本相同,但前者仅适用于已登录的用户,而上述方法仅要求用户在加载字体之前加载页面,以防止热链接。


这不是我的问题的答案。我想知道可以做什么。 - meo
你问这种方法是否有意义,我同意。使用像mod_security这样的模块,并将过滤器应用于字体目录,如'SecFilterSelective "HTTP_REFERER" "^[^?]*mydomain.com"',将拒绝来自其他站点的所有不符合规定的请求。 - Joseph Lust
是的,但你谈论了一个好的开始,接下来呢? :) - meo
当某人使用您的应用程序时,您会在服务器上为其提供一个会话(例如 PHP),并在其中存储 uniqueId。然后,您引用一个动态页面来获取字体(例如 getFont.php?uniqueId=foo),如果 uniqueId 与他们的会话匹配,则只返回字体文件,否则您将假定它是伪造的 referer 热链接。这基本上与将文件放置在仅经过身份验证的用户目录中相同,但是如果用户已登录,则此方法仅适用于该用户,而上述方法仅要求用户在加载字体之前加载页面即可防止热链接。 - Joseph Lust
哦,太好了,如果你在你的回答中加入这个,你至少会得到一个+1。 - meo

7
请看这里
显然,FontShop已经批准了(最后一条评论),而MyFonts则建议使用(http://twitter.com/#!/MyFonts/status/98767132321521664)。
编辑:我猜这就是在评论26中提到的解决方案。
RewriteCond "%{HTTP_HOST}_%{HTTP_REFERER}" "!\.?([^\.]+\.[^\.]+?)_https?://.*\1/.*$"
RewriteRule \.(woff|eot)$ - [F,NC,L]

找到正确的帖子有点困难。如果您能添加与您的答案相关的引用,您至少会得到我的+1,也许还有正确的答案。 - meo

6
您可以在typekit的文章中找到一些有趣的方法:“在Web上提供和保护字体”。这些方法包括HTTP Referrer检查、base64编码、分段等。但是,这些方法都无法完全保护字体不被盗用。正如文章中所述,“事实上,要让某物出现在浏览器中,它必须存在于Web上。如果它存在于Web上,就无法完全保护......我们已经设置了一些障碍。我们的目的只是为了防止偶然的误用,并明确表示从Typekit获取字体是明确而有意的行为。”
第二个需要注意的事情是,授权用户始终可以忽略协议。这就是像Adobe这样生产最优秀字体之一的公司在字体许可页面中规定Web使用条款的原因。
此外,W3 CSS3 webfonts规范中还讨论了字体许可问题

2

我不是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访问。


0

这是一个混合目标 - 在给每个人一份文件的同时保护文件不被复制。Twisted Pear的回答可能是在寻找平衡方面最好的。

如果您想保护文件,则可以在服务器上将文本呈现为图像。

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


我唯一想要的就是尊重Font.com的协议,而不使用图片...那么使用Web字体的好处在哪里呢... - meo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接