Squeak.ru - шаблоны программирования

Уязвимость почтового запроса Ajax

Я пытаюсь записать пользовательские клики по определенному iFrame в div, содержащем рекламу, чтобы заблокировать проблемные IP-адреса, тем самым не позволяя тем, кто пытается спамить рекламу, щелкнуть ее снова. При каждом щелчке пользователя запись будет вставлена ​​в таблицу базы данных mySQL, которая включает:

  1. айпи адрес
  2. Счетчик кликов
  3. Временная метка Unix

Каждый пользователь/IP-адрес имеет право щелкнуть объявление 3 раза в течение 24 часов. Для обнаружения каждого клика по объявлению iFrame я использовал iframeTracker-jquery. class и реализовал следующий код JavaScript:
index.php:

<?php include 'AdProtection.php'; ?>

<html>

<head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
    <script src="js/jquery.iframetracker.js"></script>
    <script>
        jQuery(document).ready(function($) {
                    $('.iframetrack iframe').iframeTracker({
                            blurCallback: function() {
                                console.log("Click has been detected!");
                                $.ajax({
                                        type: "POST",
                                        url: "update.php"
                                    );
                                }
                            });
                    });
    </script>
</head>

<body>
    <div class="iframetrack" id="adsense_frame">
        <?php //Returns true when a user 's IP address isn't currently blocked by checking in Database. if(AdProtection::protectAd()) echo '<iframe width="728" height="90" src="js/demo/sample-iframe/red.html" frameborder="0" allowtransparency="true" scrolling="no"></iframe>'; ?>
    </div>
</body>

</html>

обновление.php:

<?php

function update($odb)
{
    $sql=$odb->prepare('INSERT INTO system (ip, clicks, timestamp) VALUES(:ip, clicks+1, :timestamp) ON DUPLICATE KEY UPDATE clicks = clicks+1, timestamp = :timestamp');
    $sql->execute(array(':ip' => ip2long($_SERVER['REMOTE_ADDR']),':timestamp' => time()));
}

//PDO Connection
include ( "db.php");
$sql=$odb->prepare('SELECT clicks, timestamp FROM system WHERE ip= :ip');
$sql->execute(array(':ip' => ip2long($_SERVER['REMOTE_ADDR'])));
$data = $sql->fetch();
if($data != null)
{
    if($data['clicks'] % 3 == 0)
    {
        if(($data['timestamp'] + (24 * 60 * 60)) < time())
            update($odb);
        else
            //User is currently blocked.
    }
    else
        update($odb);
}
else
    update($odb);

При реализации этого кода JavaScript/jQuery POST-запроса возникают две важные проблемы:

  1. Кодом может манипулировать/модифицировать человек, поскольку JavaScript является клиентским языком.
  2. В файле update.php можно сделать спам.

Как я могу справиться с этими проблемами?


  • Почему это имеет значение? Если под спамом на ваш update.php вы подразумеваете быстрый повторный доступ, все, что произойдет, это то, что пользователь очень быстро заблокирует себя. 13.05.2015
  • Что, если несколько ботов будут спамить одновременно? Кроме того, запрос ajax можно манипулировать таким образом, что запрос не будет отправлен в файл update.php. 13.05.2015
  • Я думаю, вам нужно более четко определить свои цели. ПОЧЕМУ вам нужно предотвратить трафик НА объявление? В этом и смысл рекламы, чтобы привлечь трафик. Если вы отдаете должное ежедневным кликам, то кого волнует, превышают ли они свои 3 клика. Вы записываете их 3 клика и позволяете им продолжать спамить их. 13.05.2015
  • Я хочу заблокировать эти IP-адреса, чтобы предотвратить спам по рекламе, поэтому я ограничиваю каждый IP-адрес кликами 3 раза в течение 24 часов. 13.05.2015
  • Проверьте ip, если все в порядке, ТОГДА покажите фреймы, пробел, если они уже проголосовали 3 раза, то не показывайте фреймы 13.05.2015
  • Это то, что код в значительной степени делает, но это не проблема. Проблема в том, что запрос ajax может быть изменен человеком, который может видеть рекламу, и продолжать спамить ее. Запрос ajax можно манипулировать таким образом, что запрос не будет отправлен в файл update.php, что приведет к обходу проверки. 13.05.2015
  • То, что я предложил, совсем не то, что делает ваш код. 13.05.2015

Ответы:


1

Делайте проверки на стороне сервера. Всегда. У вас нет ни контроля, ни надежной информации о клиенте, поэтому не доверяйте ему что-либо конфиденциальное.
В конечном счете, пользователь может просто загрузить исходный код браузера с открытым исходным кодом и изменить его по своему желанию. .

Отключение вещей на стороне клиента является хорошим плюсом, если это указывает на то, что функциональность недоступна, и это может сэкономить вам и вашим пользователям некоторое время и пропускную способность, но будут те, кто попытается обойти это, и для тех, кого вам нужно подготовлено.
Отключение вещей на стороне сервера означает просто отказ от выполнения, то есть просто поставьте exit; после вашего комментария //User is currently blocked., это должно сделать это.

По вашему второму вопросу: да, файл update.php может быть заспамлен, как и любой другой PHP-скрипт. время.
Lighttpd имеет собственный mod_evasive, nginx имеет HttpLimitReqModule и для Apache есть ряд вещей, см. это ТАК ответ.
Если спам превышает возможности вашего веб-сервера, пришло время заняться защитой от DDos.

13.05.2015
  • Как «выйти»; Команда в файле update.php поможет мне при попытке справиться с манипуляциями на стороне клиента? Предположим, что клиент/пользователь изменил запрос POST ajax на url: вместо url: update.php. При этом запись, включающая его IP-адрес, не будет вставлена ​​через файл update.php, что приведет к обходу системы. Спасибо за ваш ответ. 13.05.2015
  • Вы имеете в виду, что вы показываете прямую ссылку на внешнюю рекламу и хотите иметь пуленепробиваемый способ определить, был ли клик по ней? Я считаю, что это возможно только путем передачи всего через ваш сервер. Создайте файл PHP, который извлекает содержимое объявления, изменяет ссылку, чтобы она указывала на update.php, и повторяет ее. Отобразите это на странице вместо объявления, а в конце update.php перенаправьте пользователя на фактическую страницу объявлений (header('Location: ...');). Кроме этого, вы почти ничего не можете сделать. 13.05.2015

  • 2
    1. Кодом Js может манипулировать кто угодно, так как его клиентская сторона все, что вы можете сделать, это минимизировать риск того, что ваш код может быть потенциально отключен другим скриптом, чтобы сделать это, напишите свой js, чтобы использовать только частные методы и переменные в самовыполняющемся функция. Таким образом, код не будет виден в глобальном пространстве имен, вам также может потребоваться скопировать определения глобально доступных объектов (таких как document или getElementById), поскольку они могут изменить их, а не ваш код. После этого обфусцируйте код и минимизируйте его.

    2. Для PHP вам, вероятно, потребуется реализовать какую-то аутентификацию для работы в паре с вашим js-скриптом, поскольку это не что иное, как защита любого запроса на доступ, так что, возможно, проверка IP или сеанса. Yo также может реализовать некоторые другие механизмы на стороне сервера, чтобы предотвратить доступ к этому сценарию с определенных IP-адресов.

    Вы также можете вообще не отображать iframe для определенных IP-адресов или по отпечатку пальца устройства http://en.wikipedia.org/wiki/Device_fingerprint, который не будет зависеть от логики на стороне клиента, это, вероятно, сделает его более безопасным, чем предложенное вами решение.

    13.05.2015
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...