Селективный Framebursting

Я хотел бы реализовать выборочный Framebursting для моего приложения iframe.

My iframe доступен в www.mywebsite.con/iframe.aspx?lic=1234

Когда сторонний веб-сайт, на котором размещается мой iframe, является (PayedWebsited1.con OR PayedWebsited2.con). Также существует опция lic=1234, отображающая iframe. Для любых других читеров отобразите бананы!

Как я могу это сделать?

Ответ 1

Global.asax сделал трюк!

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
        Dim ref As String = HttpContext.Current.Request.ServerVariables("HTTP_REFERER")
        If Not ref.Contains("PayedWebsited1") And Not ref.Contains("PayedWebsited2") Then
            Response.Redirect("MYDOMAIN", True)
        End If
 End Sub

Спасибо всем!

Ответ 2

Дело в том, что номер лицензии никоим образом не поможет - используете ли вы серверное решение или в javascript. Читеры смогут увидеть этот номер лицензии в PayedWebsite1.com.

Как было сказано, вы не можете получить родительское расположение фреймов, но вы можете получить реферер - он равен родительскому фрейму, если ваша страница загружена в iframe.

if (window.top.location !== document.location) {  // only if we're in iframe
                           // we get host of our referrer
    var host = document.referrer.match(new RegExp("(http|https)://(.*?)/.*$"))[2];
    host = host.toLowerCase();  // convert to lower case
    var myHost = document.location.host.toLowerCase();
    if (
        host !== myHost                  // so we can click on links in an iframe
        && host !== 'payedwebsite1.com'
        && host !== 'payedwebsite2.com'
    ) {
        window.top.location.href = document.location.href;
    }
}

Помните, что эту технику можно избить. Дополнительная информация на http://javascript.info/tutorial/clickjacking

Для более новых браузеров вы можете отправить специальный заголовок:

X-Frame-Options: DENY

Логика сохраняет то же самое, только на стороне сервера. Проверьте Referrer, если PayedDomain или ваш собственный домен, просто продолжайте движение. В противном случае отправьте этот заголовок.

Ответ 3

Если ваши сторонние пользователи могут включить файл javascript или в идеале отправить запрос в ASP до рисования страницы, это то, что я сделал бы:

Javascript

  • Создайте страницу ASP (я использую PHP, поэтому мой пример на PHP) на вашем сервере, которая проверяет ссылочный номер и номер лицензии для соответствия учетной записи в вашей базе данных. Затем ASP файл должен выводить функции javascript, которые заменяют или вставляют в элемент, указанный вами iframe, с помощью генерируемого вами "одноразового использования". Файл может выглядеть примерно так:

    <?php
    $lic = $_GET['lic']; // Do better validation (short for demo purposes)
    if (valid_license($lic, $_SERVER['HTTP_REFERER'])) {
        $one_time_key = get_access_key($lic);
        ?>
        function drawIframe() {
            document.getElementById('iframe_target').innerHTML = "<iframe src='mysite.php?key=<?php echo $one_time_key;?>'></iframe>";
        }
        <?php
    }
    else {
        echo "You are not authorized to use this service.";
    }
    
  • Попросите вашего клиента включить этот код javascript в качестве замены вашего iframe, подобным этому:

    <script src="http://www.yoursite.com/preauth.php?lic=1234"></script>
    <script>drawIframe();</script>
    <div id="iframe_target"></div>
    
  • На странице, загруженной iframe, немедленно проверьте ключ, который вы создали, на значение, переданное в iframe. Если это действительно так, немедленно удалите или измените статус ключа, чтобы вы знали, что он используется. Затем отобразите соответствующее приложение.

    • Этот метод javascript будет наименее болезненным методом для ваших сторонних пользователей, хотя его можно бить (пользователи могут изменить "референт", который отправляется на ваш сервер, хотя это маловероятно.)

ASP

Если вы можете заставить своих пользователей сделать запрос на ваш URL-адрес на своем сервере, вы устраните возможность предоставления любой рискованной информации, такой как лицензия для пользователя. Они могли бы вызвать что-то вроде $key = file_get_contents("http://www.yoursite.com/preauth.asp?lic=1234"); Сразу после того, как они смогут вывести iframe с помощью только того, что вы только что создали.

Ответ 4

Из-за безопасности ваш браузер не позволит вам использовать javascript для определения URL-адреса родительской страницы (то есть страницы, содержащей iframe, отображающий вашу страницу).

Единственные решения, о которых я могу думать, следующие:

  • Настаивайте на том, что пользователи вашей страницы iframe.aspx включают дополнительный параметр GET, который указывает домен, который они используют.
  • Используйте Request.UrlReferrer, чтобы получить реферер

На странице, которую вы визуализируете, вы должны иметь литерал, который, если вы хотите, чтобы человек не создавал вашу страницу, вы можете просто добавить javascript, необходимый для принудительного создания фреймов.

К сожалению, если Javascript отключен, это сделает ваш код бесполезным...

Надеюсь, что это поможет?

protected void page_load(object sender, EventArgs e)
{
    bool killFrames = false;
    if(Request.QueryString["lic"] == null)
        killFrames = true;
    if(!killFrames && Request.UrlReferrer != null)
    {
        // do some database check against the LIC and Referrer
        // and set killFrames accordingly.
    }
    if(killFrames)
    {
        literalFrame.Text = "<script type=\"text/javascript\">if(top.location != location) { top.location.href = document.location.href; }</script>";
        // or show the bananas
    }
    else
    {
        // render the page accordingly.
    }
} 

Ответ 5

Я попытаюсь указать решение для вашей общей проблемы, а не на эту конкретную техническую проблему, которая, насколько я знаю, невозможна для мер предосторожности, выполняемых всеми веб-браузерами.


Вам нужно какое-то ручное дрожание между своим приложением и вашим, и это может быть сделано на стороне сервера.

Каждый PayedWebsite должен иметь пароль (или если у него есть статический IP-адрес, который вы могли бы использовать). Внутренне на их сервере (используя CURL может быть) они отправили вам -via POST- свой пароль; то вы возвращаете токен, который используется в iframe.

iframe.aspx?lic=1234&token=d16evg5tr44e0trty45xp6es5

И токен работает только один раз; поэтому процесс должен быть повторен каждый раз, когда iframe нужно открыть. И вы отказываетесь от каждого соединения, которое не включает действительный токен.

Ответ 6

Я не эксперт .NET, но похоже, что ваше решение можно легко решить, отслеживая заголовок реферала, который клиент отправляет на вашу страницу при загрузке содержимого iframe.

Вы можете обратиться к другому вопросу, касающемуся заголовков ссылок: как мы должны проверить HTTP-реферер заголовка в aspx.net

В принципе, вы бы сделали следующее

  • Используйте заголовок реферала, чтобы получить имя домена
  • Найдите имя домена в своей базе данных (чтобы узнать, есть ли лицензия для этого сайта)
  • Отправьте реальную страницу или бананы в зависимости от результата матча.