Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Задача: Загадать определенную картинку, записать в базу данных. Показать загаданную картинку на одном сайте. Разгадать загаданную картинку на другом сайте. Защита сценария от взлома и искусственной накрутки.

Во всем сценарии участвуют 3 сайтах, размещенных на разных серверах.

Сайт № 1: На нем находится база данных MySQL, а также PHP-скрипт взаимодействия с базой данных.

Сайт № 2: Этот сайт подключается к сайту № 1 через cURL, читает загаданную картинку с базы данных и выводит ее для показа.

Сайт № 3: На этом сайте через JavaScript рандомно показываются 5 картинок. Среди них есть и загаданная. Задача посетителя кликнуть по загаданной картинке, чтобы ее угадать.

Теперь подробнее о пошаговом сценарии:

01. В базе данных заранее уже определена загаданная картинка, которая имеет значения от 1 до 5. Например поле "image" со значением "2".

02. На сайте № 2 идет подключение к сайту № 1 посредством cURL на скрипт image.php. Тот возвращает значение загаданной картинки "2". У каждой картинки свой номер, который соответствует загаданной картинке. Например: 1.png, 2.png, 3.png, 4.png, 5.png.  Также сайт № 2 через Ajax каждые 5 секунд подключается к сайту № 1, чтобы прочитать значение загаданной картинки с базы данных. И меняет ее, если значение в таблице базы данных изменилось.

03. На сайте № 3 через JavaScript рандомно var x = Math.floor((Math.random() * 5) + 1); определяется случайным образом картинка и показывается через document.getElementById("changeimg").innerHTML = '

var myVar = setInterval(function(){ randtoys() }, 3000);

У картинки стоит событие onclick="onSubmit('+x+');" На функцию onSubmit() я также повесил Google Recaptcha, которая вместе с выбранной картинкой отправляет запрос через Ajax на PHP скрипт check.php, который находится на этом же сайте № 3. В этом скрипте проверяется Google Recaptcha, если все ок, идет запрос через cURL на сайт № 1 базы данных к PHP-скрипту image.php?check=1&num=X (где num=X - это выбранная картинка посетителем).

04. Далее на сайте № 1 присланное значение "num" сравнивается со значением с базой данных. Если совпадает = успешно, если не совпадает, возвращает ошибку.

Собственно это и весь сценарий. Проблема в том, что злоумышленники нашли дырку и как-то обходят внутреннюю защиту через прямые запросы на файлы скриптов, минуя сценарий проверки. То есть, они как-то узнали адрес скрипта, который подключается к сайту № 1 базы данных и минуют проверку Google Recaptcha на сайте № 3.

Узнал я это таким образом: Каждый раз, когда игрушка успешно угадывается, в скрипте на сайте базы данных в таблице MySQL меняется значение общего числа угаданных картинок. Также в этом скрипт фиксируется общее количество запросов к скрипту в отдельную таблицу. В общем число успешно угаданных не меняется, а количество фиксируемых запросов на успешные угадывания фиксируются. Если все выполнять по сценарию, без взлома и обхода защиты, общее число успешно угаданных картинок меняется.

Как защитить этот сценарий от попытки взлома или обхода защиты? Как заставить посетителя обязательно отправить запрос именно с браузера сайта № 3, именно с конкретно определенной страницы, именно кликая на картинку, чтобы обязательно при клике на загаданную картинку прошел проверку Google Recaptcha и запрос отправился с сайта № 3 на сайт № 1 базы данных с выбранным значением картинки?

На сайте № 3, когда посетитель открывает любую страницу, я записываю зашифрованный ключ в cookie. Также этот ключ в зашифрованном виде записываются в session. Перед отправкой параметров на сайт № 1, читается значение ключа с cookie, сравнивается со значением session. Конечно, это бесполезно, если cookie также успешно записывается без обязательного открытия сайта № 3 в браузере. Тогда я не знаю как еще сделать защиту, чтобы вынудить отправлять запросы только с открытого браузера, чтобы нельзя было напрямую отправить запрос на PHP-скрипт.

Есть практические идеи как и где защитить запросы? Или вообще решение такой задачи? Я любитель в PHP. Можно просто из-за отсутствия знаний не могу сообразить как защитить такой сценарий.

7 лет назад
secretuser
Андрей 
36 лет
7 лет в сервисе
Был
7 лет назад

Заявки фрилансеров

Нет заявок фрилансеров