防止从其他网站链接css

本文关键字:网站链接 css 其他 | 更新日期: 2023-09-27 17:58:21

我的网站上有一个comerce css。我使用IIS,供应商说其他人可以使用我的css字体,因为他们知道url。是否可以设置服务器或其他东西,以便只有我的网站才能使用它?这是关于cufon

防止从其他网站链接css

您可以做的事情:

  1. 放弃。如果你的用户可以看到它,他们就可以窃取它。同样,不要指望保护你的网站不受用户查看其源代码的影响
  2. 如果字体是矢量字体,请将字体光栅化为您支持的所有字体大小,但不包括其他字体。这可能会对用户的浏览体验产生负面影响。这使得窃取你的字体会减少有用的数据,但实际上并不能阻止盗窃
  3. 将字体的所有使用替换为位图。在这种情况下,需要窃取更多的工作,并且只向用户提供光栅化版本的字体(不一定是所有字母)。您可以创建一个特殊的文本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);
    }
}