javascript — уязвимость в Ajax-запросе

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

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

Каждый пользователь / IP-адрес имеет право нажать на объявление 3 раза за 24 часа.
Для определения каждого клика по объявлению iFrame я использовал iframeTracker-JQuery Класс и реализовал код 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>

update.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);

При реализации этого POST-кода JavaScript / jQuery существует 2 критических проблемы:

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

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

0

Решение

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

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

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

2

Другие решения

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

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

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

-1

По вопросам рекламы [email protected]