C# 防止从其他站点链接css

C# 防止从其他站点链接css,c#,asp.net,iis,cufon,C#,Asp.net,Iis,Cufon,我的网站上有一个comerce css。我使用IIS,供应商说其他人可以使用我的css字体,因为他们知道url。是否可以设置服务器或其他东西,以便只有我的站点可以使用它?这是关于cufon的,不可靠。为了提供嵌入式字体,它们需要公众可读,并且可以被CSS引用 您可以创建一个asp.net页面,或者创建一个处理程序,该处理程序接受字体文件的一个参数,从您网站的某个位置读取文件(应用程序数据是放置它们的好地方-您无法浏览到应用程序数据)并将其吐出。在脚本中,您可以检查HTTP_REFERER服务器端

我的网站上有一个comerce css。我使用IIS,供应商说其他人可以使用我的css字体,因为他们知道url。是否可以设置服务器或其他东西,以便只有我的站点可以使用它?这是关于cufon的,不可靠。为了提供嵌入式字体,它们需要公众可读,并且可以被CSS引用

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

MSDN有一个示例。您需要确保MIME类型正确,但是请注意,这可能会破坏浏览器或代理提供的任何缓存。这也不会阻止人们通过在浏览器中键入URL并将其保存在本地来下载字体,但如果带宽是一个问题,那么这并不是一个真正的问题

如果你在IIS7上,你可以编写一个Http模块来为你做推荐人检查,Scott Hansleman在很久以前写过一个,你可以编辑它以符合你的目的

您可以做的事情:

  • 放弃。如果你的用户能看到它,他们就能偷走它。同样,不要期望保护您的站点不受用户查看其源代码的影响
  • 如果字体是矢量字体,则根据您支持的所有字体大小对字体进行栅格化,但不支持其他字体大小。这可能会对用户的浏览体验产生负面影响。这使得盗用字体提供的有用数据减少,但实际上并不能阻止盗用
  • 将字体的所有使用替换为位图。在这种情况下,需要做更多的工作,只给用户提供栅格化版本的字体(不一定是所有的字母)。您可以创建一个特殊的文本
    UserControl
    ,将位图粘贴到您放置的位置,因此实际上这并不需要做很多工作或维护。不过,它确实增加了页面的带宽要求。它还迫使您手动完成一些通常由浏览器处理的布局,这可能会增加大量维护成本或最低维护成本,具体取决于站点布局的工作方式。与#2一样,它可能会对用户的浏览体验产生负面影响。这也会影响可访问性,尽管这并不荒谬,因为您的
    UserControl
    可能会使用alt text来复制文本

  • 我强烈推荐#1。

    您可以制作一个http处理程序来提供css文件。在自定义http处理程序中,检查request.Url.Host是否等于request.urlReferer.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);
        }
    }
    
    
    公共类CustomCSSHandler:IHttpHandler
    {
    公共无效处理请求(HttpContext ctx)
    {
    HttpRequest请求=ctx.Request;
    //从查询字符串中获取文件
    字符串file=req.QueryString[“file”];
    //找到实际路径
    string path=ctx.Server.MapPath(文件);//可能需要修改css的位置
    //仅限于css文件
    if(Path.GetExtension(Path)!=“.css”)
    ctx.Response.End();
    if(req.urlreferer!=null&&req.urlreferer.Host.Length>0)
    {
    if(CultureInfo.InvariantCulture.CompareInfo.Compare(req.Url.Host,req.urlreferer.Host,CompareOptions.IgnoreCase)!=0)
    {
    path=ctx.Server.MapPath(“~/thiswontexist.css”);
    }
    }   
    //确保文件存在
    如果(!File.Exists(path))
    {
    ctx.Response.Status=“未找到文件”;
    ctx.Response.StatusCode=404;
    ctx.Response.End();
    }           
    ctx.Response.StatusCode=200;
    ctx.Response.ContentType=“text/css”;
    ctx.Response.WriteFile(路径);
    }
    }
    
    如果您使用的是IIS7或更高版本,则无需编写任何自定义代码即可执行引用检查,只需在讨论的庄园中使用IIS URL重写即可。但是,作为简单的引用检查,它存在其他答案中讨论的缺点

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

    摘自第一个链接:

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

    • 将规则的名称指定为“防止泄漏”。这一定是个好主意 唯一的规则
    • 每个请求的URL都将匹配,因为模式为“*”且为 正则表达式
    • 添加了两个条件,并指定了要满足的两个条件 (参见“逻辑分组”是“匹配” 全部)
    • HTTP_REFERER不匹配为空,因为它可以直接引用 形象
    • HTTP\u REFERER与我自己的站点不匹配
    如果满足上述两个条件 满意(显然是指 请求来自任何其他人 网站),我们只是将其重定向到 拿起一些其他图像,可以 什么都行,就这样。所以没有 我们甚至可以编写一行代码 能够防止热链接

    我可能会定制您的重写配置,以便它只在字体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
    ),但是您也可以重定向到一个带有友好通知的页面。

    +1,同样重要的是要注意,对于OP,没有任何内容会被删除