запретить ссылки css с других сайтов - PullRequest
5 голосов
/ 01 июня 2011

У меня есть comrce css на моем сайте. Я использую IIS, и продавец говорит, что другие могут использовать мои шрифты CSS, потому что они знают URL. Можно ли настроить сервер или что-то такое, чтобы его мог использовать только мой сайт? Речь идет о cufon

Ответы [ 4 ]

2 голосов
/ 04 июня 2011

Если вы используете IIS7 или более позднюю версию, вы можете выполнить проверку Referer без написания какого-либо пользовательского кода, просто используя переписывание URL-адреса IIS в обсуждаемом поместье здесь . Однако просто Проверка рефери, есть недостатки, обсужденные в других ответах.

(Для ознакомления с IIS URL Rewrite см. здесь .)

Выдержка из первой ссылки:

Позвольте мне теперь объяснить, что мы сделали на этой странице недвижимости:

  • Указано название правила как «Предотвратить пиявку». Это должно быть уникальное правило.
  • Каждый запрашиваемый 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), однако вы могли бы также перенаправить на страницу с дружественным уведомлением.

2 голосов
/ 01 июня 2011

Что вы можете сделать:

  1. Сдавайся. Если ваши пользователи видят это, они могут украсть это. Точно так же не ожидайте защитить свой сайт от пользователей, просматривающих его исходный код.
  2. Если шрифт является векторным шрифтом, растеризуйте шрифт для всех поддерживаемых вами размеров шрифта, но не для других. Это может оказать негативное влияние на опыт просмотра ваших пользователей. Это делает кражу вашего шрифта менее полезной информацией, но фактически не останавливает кражу.
  3. Заменить все использование шрифта с растровыми изображениями. Гораздо больше работы, чтобы украсть в этом случае, и только дает пользователю растеризованную версию шрифта (и не обязательно все буквы). Вы можете создать специальный текст UserControl, который прикрепит растровое изображение, куда бы вы его ни поместили, так что на самом деле это не так уж много работы или поддержки. Тем не менее, это увеличивает требования к пропускной способности для вашей страницы. Это также заставляет вас делать некоторые макеты вручную, которые обычно обрабатываются браузером, что может добавить большие расходы на обслуживание или минимальные затраты на обслуживание, в зависимости от того, как работает макет вашего сайта. Как и в случае с № 2, это может оказать негативное влияние на работу пользователей в Интернете. Это также вредит доступности, хотя и не абсурдно, так как ваш UserControl, вероятно, будет использовать альтернативный текст для дублирования текста.

Я настоятельно рекомендую # 1.

1 голос
/ 01 июня 2011

Ненадежно. Чтобы обслуживать встроенные шрифты, они должны быть доступны для чтения публике и ссылаться на ваш CSS.

Что вы можете сделать, это создать страницу asp.net или обработчик, который принимает параметр файла шрифта, считывает файл из какого-то места на вашем веб-сайте (APP_DATA - хорошее место для их размещения - вы не можете перейдите к APP_DATA) и выплевывает его. В этом скрипте вы можете проверить переменную на стороне сервера HTTP_REFERER, и если она либо пустая, либо поступает с вашего сайта, вы серверный файл, если это не так.

MSDN имеет пример , как обслуживать двоичный файл в C # . Вам нужно убедиться, что вы правильно указали тип MIME, однако имейте в виду, что это может нарушить любое кэширование, предоставляемое браузером или прокси-серверами. Это также не остановит людей, загружающих шрифты, введя URL-адрес в их браузер и сохранив их локально, но если пропускная способность является проблемой, это не будет проблемой.

Если вы работаете на IIS7, вы можете написать Http-модуль, который будет выполнять проверку ссылок, Скотт Хэнслман написал его для предотвращения потери изображения довольно давно, вы можете отредактировать его так, чтобы он соответствовал вашему цели.

0 голосов
/ 04 июня 2011

Вы можете создать обработчик 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);
    }
}
...