防止将css与其他网站链接

时间:2011-06-01 13:04:25

标签: c# asp.net iis cufon

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

4 个答案:

答案 0 :(得分:2)

你可以做的事情:

  1. 放弃。如果您的用户可以看到它,他们可以窃取它。同样,不要期望保护您的网站免受查看其源代码的用户的影响。
  2. 如果字体是矢量字体,请对您支持的所有字体大小的字体进行光栅化,但不使用其他字体。这可能会对用户的浏览体验产生负面影响。这使窃取你的字体的数据更少,但实际上并没有阻止盗窃。
  3. 将所有字体替换用位图替换。在这种情况下窃取更多的工作,并且只给用户光栅化版本的字体(并不一定是所有字母)。你可以创建一个特殊的文本UserControl,它可以在任何地方放置一个位图,所以这实际上并没有那么多工作要做或维护。但它确实增加了页面的带宽要求。它还会强制您手动执行一些通常由浏览器处理的布局,这可能会增加大量维护成本或最低维护成本,具体取决于站点布局的工作方式。与#2一样,它可能会对用户的浏览体验产生负面影响。它也会伤害可访问性,但并非荒谬,因为您的UserControl可能会使用替代文字来复制文本。
  4. 我强烈推荐#1。

答案 1 :(得分:2)

如果您使用的是IIS7或更高版本,则可以在不编写任何自定义代码的情况下执行Referer检查,只需在讨论的here庄园中使用IIS URL Rewrite。然而,仅作为Referer检查,它有其他答案中讨论的缺点。

(有关IIS URL重写的介绍,请参阅here。)

摘自第一个链接:

  

现在让我解释一下我们做了什么   在这个属性页面上:

     
      
  • 规则的名称为“Prevent Leeching”。这必须是一个   独特的规则。
  •   
  • 每个请求的URL都将匹配,因为模式为“。*”并且是a   正则表达。
  •   
  • 添加了两个条件并指定了要满足的条件   (参见“逻辑分组”是“匹配   所有“)
  •   
  • HTTP_REFERER与空匹配,因为它可以直接引用   图像
  •   
  • HTTP_REFERER与我自己的网站http://www.contoso.com
  • 不匹配   
     

如果满足以上两个条件   满意(显然意思是   请求来自任何其他   网站),我们只是将其重定向到   拿起一些其他可能的图像   什么就是这样。所以没有   我们甚至编写一行代码   能够防止热链接。

我可能会定制您的Rewrite配置,以便它只对您的字体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),但您也可以通过友好通知重定向到页面。

答案 2 :(得分:1)

不可靠。为了提供嵌入式字体,他们需要公众可读,并且可以通过CSS进行处理。

你可以做的是创建一个asp.net页面,或者一个带有字体文件参数的处理程序,从你网站的某个地方读取文件(APP_DATA是放置它们的好地方 - 你不能浏览到APP_DATA)并将其吐出。在脚本中,您可以检查HTTP_REFERER服务器端变量,如果它是空白的,或者来自您的站点,则为服务器提供文件,如果不是,则不是。

MSDN有how to serve up a binary file in C#的示例。您需要确保正确获取MIME类型,但请注意,这可能会破坏浏览器或代理提供的任何缓存。这也不会阻止人们通过在浏览器中输入URL并将其保存在本地来下载字体,但是如果带宽是关注点并不是真正的问题。

如果您使用的是IIS7,您可以编写一个Http模块,可以为您进行引荐来检查,Scott Hansleman很久以前就为image leeching prevention编写了一个,您可以编辑它以符合您的目的。

答案 3 :(得分:0)

您可以创建一个http处理程序来提供css文件。在自定义http处理程序中,检查request.Url.Host是否等于request.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);
    }
}