C# 防止从其他站点链接css
我的网站上有一个comerce css。我使用IIS,供应商说其他人可以使用我的css字体,因为他们知道url。是否可以设置服务器或其他东西,以便只有我的站点可以使用它?这是关于cufon的,不可靠。为了提供嵌入式字体,它们需要公众可读,并且可以被CSS引用 您可以创建一个asp.net页面,或者创建一个处理程序,该处理程序接受字体文件的一个参数,从您网站的某个位置读取文件(应用程序数据是放置它们的好地方-您无法浏览到应用程序数据)并将其吐出。在脚本中,您可以检查HTTP_REFERER服务器端变量,如果该变量为空,或者来自您的站点,您可以为该文件提供服务器,如果不是,则不提供 MSDN有一个示例。您需要确保MIME类型正确,但是请注意,这可能会破坏浏览器或代理提供的任何缓存。这也不会阻止人们通过在浏览器中键入URL并将其保存在本地来下载字体,但如果带宽是一个问题,那么这并不是一个真正的问题 如果你在IIS7上,你可以编写一个Http模块来为你做推荐人检查,Scott Hansleman在很久以前写过一个,你可以编辑它以符合你的目的 您可以做的事情:C# 防止从其他站点链接css,c#,asp.net,iis,cufon,C#,Asp.net,Iis,Cufon,我的网站上有一个comerce css。我使用IIS,供应商说其他人可以使用我的css字体,因为他们知道url。是否可以设置服务器或其他东西,以便只有我的站点可以使用它?这是关于cufon的,不可靠。为了提供嵌入式字体,它们需要公众可读,并且可以被CSS引用 您可以创建一个asp.net页面,或者创建一个处理程序,该处理程序接受字体文件的一个参数,从您网站的某个位置读取文件(应用程序数据是放置它们的好地方-您无法浏览到应用程序数据)并将其吐出。在脚本中,您可以检查HTTP_REFERER服务器端
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与我自己的站点不匹配
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,没有任何内容会被删除