Как защититься от куки-стаффинга

В прошлой статье мы разобрались, что такое куки-стаффинг: это когда мошенник тайком подсовывает вам в браузер «печеньку-рекомендацию», хотя ничего вам не советовал, а потом получает за это деньги от магазина. Теперь давайте посмотрим, как магазин может защититься от такой хитрости с помощью двух простых идей — редиректа и ClickID.
Вспомним, в чём была проблема
Раньше «печенька» с надписью «этого человека привёл партнёр Вася» могла попасть к вам в браузер просто так — без вашего клика. Мошенник подсовывал её сам, за кулисами. Магазин смотрел на печеньку и верил ей на слово. В этом и была ошибка: магазин доверял любой печеньке, не проверяя, настоящая она или поддельная.
Чтобы обман не проходил, нужно сделать так, чтобы печеньку нельзя было подделать. И вот тут появляется хитрая пара: редирект и ClickID.
Идея 1. Редирект — это турникет на входе
Представьте вход на стадион. Люди не проходят на трибуны прямо с улицы — сначала все идут через турникет, где стоит охранник. Только через него можно попасть внутрь.
Редирект — это такой же турникет, только в интернете.
Раньше партнёрская ссылка вела прямо в магазин. Теперь она ведёт не в магазин, а сначала на специальную страницу-турникет самого магазина. Выглядит это так:
https://ваш-магазин.ру/go?partner=Вася&target=/крутые-наушники
Когда вы нажимаете на такую ссылку, вы сначала на долю секунды попадаете на этот «турникет» /go, а уже он отправляет вас дальше — в магазин, к наушникам. Вы этого даже не замечаете, всё происходит мгновенно.
Зачем нужен турникет? Затем, что теперь печеньку выдаёт только охранник на турникете, а не кто попало.
Идея 2. ClickID — это уникальный билетик
Охраннику мало просто пропустить человека. Он выдаёт каждому посетителю билетик с уникальным номером — таким длинным и случайным, что угадать его невозможно. Например: a3f9c2b8d1e4....
Этот номер и называется ClickID (по-английски — «номер клика»).
И самое важное: охранник записывает каждый выданный билетик в свой журнал. То есть в магазине хранится список всех настоящих номеров, которые он когда-либо выдавал.
Вот как это выглядит в коде на Python. Не пугайтесь — читается почти как обычный текст:
from flask import Flask, request, redirect, make_response
import secrets
app = Flask(__name__)
# Наш "журнал": сюда охранник записывает все выданные билетики.
# В настоящем проекте это база данных, а для примера — обычный список.
zhurnal = {}
@app.route("/go") # это и есть наш турникет
def turniket():
partner = request.args.get("partner") # кто привёл (из ссылки)
target = request.args.get("target") # куда ведём человека дальше
# 1. Придумываем уникальный номер билета — его невозможно угадать
click_id = secrets.token_hex(16)
# 2. Записываем билет в журнал: номер, партнёр, и что он ещё не использован
zhurnal[click_id] = {"partner": partner, "ispolzovan": False}
# 3. Кладём билет-печеньку в браузер и отправляем человека в магазин
otvet = make_response(redirect(target))
otvet.set_cookie("click_id", click_id, max_age=2592000,
httponly=True, samesite="Lax")
return otvet
Тут происходит ровно три шага: придумали номер → записали в журнал → положили в браузер и пропустили дальше.
Как проверяют покупку
Теперь представьте, что вы что-то купили. Магазин смотрит на вашу печеньку и сверяется с журналом: «А есть ли такой номер билета в моём списке?»
@app.route("/pokupka")
def pokupka():
# достаём номер билета из печеньки в браузере
click_id = request.cookies.get("click_id")
# Печеньки нет? Значит, никто не приводил. Никому не платим.
if not click_id:
return "Покупка без партнёра"
bilet = zhurnal.get(click_id)
# Такого номера НЕТ в журнале? Печенька поддельная! Не платим.
if bilet is None:
return "Печенька поддельная — не засчитываем"
# Этот билет уже использовали? Второй раз не платим.
if bilet["ispolzovan"]:
return "Этот клик уже засчитан"
# Всё честно: билет настоящий и ещё не использован.
bilet["ispolzovan"] = True
return f"Засчитываем покупку партнёру {bilet['partner']}"
Почему это ломает обман мошенника
Вот в чём вся соль. Мошенник по-прежнему может подсунуть вам печеньку. Но он не знает правильный номер билета!
Настоящий номер придумывает только охранник на турникете, и придумывает его случайно. Мошеннику остаётся лишь выдумать номер наугад — например, написать в печеньке 12345. А когда магазин заглянет в журнал, он такого номера там не найдёт. Значит, печенька поддельная — и мошенник не получит ни копейки.
Получается красиво:
- Настоящий посетитель прошёл через турникет → у него есть настоящий билет из журнала → покупка засчитывается.
- Печенька от мошенника не проходила через турникет → её номера нет в журнале → покупка не засчитывается.
Очень важное правило про CPA-сети
Магазины часто получают партнёров не по одному, а через CPA-сети — это такие «биржи», где сразу много блогеров и сайтов берут ссылки на товары магазина.
И вот главное правило: все ссылки из CPA-сети должны вести через ваш турникет /go, а не напрямую в магазин.
Почему это так важно? Потому что если ссылка ведёт прямо в магазин, минуя турникет, — то никто не выдаёт билетик, никто ничего не записывает в журнал, и вся защита просто не работает. Это как построить турникет на стадионе, но оставить рядом открытую дырку в заборе: зачем тогда турникет, если можно пролезть мимо?
Поэтому в настройках партнёрской программы нужно сделать так, чтобы любая партнёрская ссылка автоматически превращалась в ссылку вида ваш-магазин.ру/go?partner=...&target=.... Тогда все посетители, кого бы ни привели, обязательно пройдут через охранника и получат честный билет.
Маленькая честная оговорка
Турникет и билетики — это очень сильная защита, но не волшебная кнопка. Хитрый мошенник может попробовать провести через турникет не живого человека, а «пустышку» — сделать так, чтобы страница /go открылась незаметно, в фоне. Поэтому охранник на турникете должен уметь отличать настоящего посетителя, который правда кликнул, от такой скрытой пустышки. Но это уже отдельная тема для следующей статьи — там научим наш турникет быть повнимательнее.
Коротко
- Редирект — это турникет: все партнёрские ссылки ведут сначала на него, а не сразу в магазин.
- ClickID — это уникальный билетик, который выдаёт только турникет и записывает в журнал.
- Магазин платит только за те покупки, чей билет есть в журнале. Поддельные печеньки мошенника номер не проходят.
- И самое важное: все ссылки из CPA-сетей обязательно должны идти через этот редирект, иначе защита не работает.
Комментарии 2