.
Сайт на PHP на примере партнерской программы. Урок 22. Защитим регистрацию визитов от хакеров
Автор megabax   
26.04.2014 г.
Структура программы на примере простейшей программы

Разработка сервиса сайта на PHP на примере партнерской программы. Урок 22. Защитим регистрацию визитов от хакеров

Что бы смотреть урок полностью, подпишитесь на платный раздел.

В платном разделе статья находиться здесь.


Исходники к уроку вы можете скачать в платном разделе.

Сегодня мы немножко отвлечемся от модульного тестирования и займемся безопасностью. Первое, на что хочется обратить внимание, это регистрация визитов. Раз мы предусмотрели возможность, что начисление партнерского вознаграждения может быть просто за переходы, то возникает вопрос: а если кто то будет накручивать переходы при помощи робота? Вот сегодня мы как раз и займемся разработкой защиты от накрутки переходов. Но прежде чем перейти непосредственно к теме, скажу об одной важной вещи. При попытке запустить скипт ref.php, где у нас пример регистрации перехода по ссылке, у меня выпало такое сообщение:

Warning: Cannot modify header information - headers already sent by (output started at X:\home\localhost\www\Part\filter.php:33) in X:\home\localhost\www\Part\partners.php on line 26

Боролся с этим несколько часов, сломал мозги и потратил кучу нервов. Оказалось, что ...

...

... сам робот так же прилагается к исходникам.

Результатом однократного запуска такого робота будет накрутка 10 посещений:

Разработка сервиса сайта на PHP на примере партнерской программы. Урок 22. Защитим регистрацию визитов от хакеров

Первая мысль это использовать $_SERVER['HTTP_USER_AGENT']. Давайте проверим. Делаем файл

<?php

    echo "HTTP_USER_AGENT: ".$_SERVER['HTTP_USER_AGENT'];

?>

Обзываем его как нить типа 1.php. Тестируем. При запуске скрипта из браузера выдает IE:

HTTP_USER_AGENT: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; MRSPUTNIK 2, 4, 0, 271; MRA 8.0 (build 5977); InfoPath.1; WebMoney Advisor; .NET4.0C; .NET4.0E)

из 1С:

HTTP_USER_AGENT: 1C+Enterprise/8.2

из FireFox:

HTTP_USER_AGENT: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.1) Gecko/20090715 Firefox/3.5.1

Но HTTP_USER_AGENT можно подделать. Это раз. Да и непонятно может, пользователь использует какой то экзотический браузер, который мы не сможем идентифицировать. Следующая идея ....

...

.... И так, начнем. Создадим таблицу _epp_sys:

Разработка сервиса сайта на PHP на примере партнерской программы. Урок 22. Защитим регистрацию визитов от хакеров

Это у нас будет ...

...

... Теперь файл test.php будет выглядеть компактно и красиво:

<?php

    include_once("EP_Unit_Test.php");

    include_once("ini.php");

    include_once("ppdb.php");

    include_once("Part/customers.php");

    include_once("Part/fees.php");

    include_once("Part/systable.php");

    include_once("testlib.php");

 

    $db=new EP_DBService();

    $db->HostName=DB_HOST;

    $db->UserName=DB_USER;

    $db->Password=DB_PASSWORD;

    $db->DBName=DB_NAME;

    $db->Prefix="_epp_";

   

    $test=new EP_Unit_Test(array("customers", "fees", "sys"),$db);

   

    //начинаем тест

    $test->begin();

   

    testEP_Customers($db, $test); //тестируем EP_Customers

    testEP_Fees($db, $test); //тестируем EP_Fees

    testEP_Systable($db, $test); //тестируем EP_Systable

   

 

    $test->end();

?>

Кстати, юнит тест мне реально помог обнаружить и исправить глюк до того, как я интегрировал EP_Systable. Так что теперь можно смело переделывать метод Register класса EP_Visites, зная, что класс EP_Systable работате без глюков. ....

...

...Да, и не забудть заинклюдить systable.php в файле visites.php. И, в принципе, все, осталось только протестировать. Для этого можно воспользоваться уже написанным на 1С роботом, только поставьте там не 10, а, например 10 циклов. И вы убедитесь, что регистрировать будет только 10, а дальше включаться таймаут, при чем таймаут будет выставлен случайным образом от 10 до 100 секунд, что бы затруднить роботу работу по вычислению таймаута.

 

 

Последнее обновление ( 26.04.2014 г. )