防止从其他网站链接css
本文关键字:网站链接 css 其他 | 更新日期: 2023-09-27 17:58:21
我的网站上有一个comerce css。我使用IIS,供应商说其他人可以使用我的css字体,因为他们知道url。是否可以设置服务器或其他东西,以便只有我的网站才能使用它?这是关于cufon
您可以做的事情:
- 放弃。如果你的用户可以看到它,他们就可以窃取它。同样,不要指望保护你的网站不受用户查看其源代码的影响
- 如果字体是矢量字体,请将字体光栅化为您支持的所有字体大小,但不包括其他字体。这可能会对用户的浏览体验产生负面影响。这使得窃取你的字体会减少有用的数据,但实际上并不能阻止盗窃
- 将字体的所有使用替换为位图。在这种情况下,需要窃取更多的工作,并且只向用户提供光栅化版本的字体(不一定是所有字母)。您可以创建一个特殊的文本
UserControl
,将位图粘贴到您放置的位置,因此这实际上不需要做或维护太多工作。不过,它确实增加了页面的带宽需求。它还迫使你手动进行一些通常由浏览器处理的布局,这可能会增加沉重的维护成本或最低的维护成本,这取决于你的网站布局的工作方式。和#2一样,它可能会对用户的浏览体验产生负面影响。这也会损害可访问性,尽管这并不荒谬,因为UserControl
可能会使用alt文本来复制文本
我强烈推荐#1。
如果您使用IIS7或更高版本,只需在此处讨论的庄园中使用IIS URL重写,就可以在不编写任何自定义代码的情况下执行Referer检查然而,作为一个简单的裁判检查,它有其他答案中讨论过的缺点。
(有关IIS URL重写的介绍,请参阅此处。)
摘录自第一个链接:
现在让我解释一下我们做了什么在此属性页上:
- 将规则的名称指定为"防止Leeching"。这一定是唯一规则
- 每个请求的URL都将匹配,因为模式是".*",并且是正则表达式
- 添加了两个条件,并指定了两个要满足的条件(参见"逻辑分组"为"匹配全部")
- HTTP_REFERER不匹配为空,因为它可能是对图像
- HTTP_REFERER与我自己的网站不匹配http://www.contoso.com
如果以上两个条件满意(显然是指请求来自任何其他网站),我们只是将其重定向到拾取其他图像任何东西就这样。所以没有写哪怕一行代码能够防止热链接。
我可能会调整您的"重写"配置,使其仅在字体URL(以及其他关注的静态资产)上执行,而不是在每个传入请求上执行。
如果您没有远程桌面访问权限,或者只是在编辑web.config
,那么您的重写规则可能看起来像:
<rule name="block font leaching" stopProcessing="true">
<match url="myFontFile.woff" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_REFERER}" pattern="^$" /><!-- no referrer -->
<add input="{HTTP_REFERER}" pattern="yourdomain.com" negate="true" /><!-- or not your site -->
</conditions>
<action type="AbortRequest" /><!-- block the request -->
</rule>
在这个例子中,我选择完全阻止请求(通过AbortRequest
),但是您也可以重定向到一个带有友好通知的页面。
不可靠。为了提供嵌入的字体,它们需要公众可读,并可由CSS引用。
你可以做的是创建一个asp.net页面,或者一个处理程序,它接受字体文件的参数,从网站上的某个地方读取文件(APP_DATA是放置它们的好地方——你不能浏览到APP_DATA)并将其吐出。在脚本中,您可以检查HTTP_REFERER服务器端变量,如果该变量为空,或者来自您的站点,则为文件提供服务器服务,如果不是,则不提供。
MSDN提供了一个如何用C#提供二进制文件的示例。您需要确保MIME类型正确,但要注意,这可能会破坏浏览器或代理提供的任何缓存。这也不会阻止人们通过在浏览器中键入URL并将其保存在本地来下载字体,但如果带宽是一个问题,那就不是真正的问题。
如果你在IIS7上,你可以写一个Http模块,它会为你做推荐人检查,Scott Hansleman不久前写了一个用于防止图像盗用的模块,你可以编辑它以符合你的目的。
您可以制作一个http处理程序来提供css文件。在您的自定义http处理程序中,检查请求。Url.Host等于请求。UrlReferrer.Host。如果它们不匹配,请将响应设置为404或提供一个空的css文件。
这是未经测试的,但应该接近你所需要的。你可以添加一个css链接,比如:
<link rel="Stylesheet" href="CustomCSSHandler.ashx?file=site.css" />
public class CustomCSSHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
HttpRequest req = ctx.Request;
//Get the file from the query stirng
string file = req.QueryString["file"];
//Find the actual path
string path = ctx.Server.MapPath(file); //Might need to modify location of css
//Limit to only css files
if(Path.GetExtension(path) != ".css")
ctx.Response.End();
if (req.UrlReferrer != null && req.UrlReferrer.Host.Length > 0)
{
if (CultureInfo.InvariantCulture.CompareInfo.Compare(req.Url.Host, req.UrlReferrer.Host, CompareOptions.IgnoreCase) != 0)
{
path = ctx.Server.MapPath("~/thiswontexist.css");
}
}
//Make sure file exists
if(!File.Exists(path))
{
ctx.Response.Status = "File not found";
ctx.Response.StatusCode = 404;
ctx.Response.End();
}
ctx.Response.StatusCode = 200;
ctx.Response.ContentType = "text/css";
ctx.Response.WriteFile(path);
}
}