Показаны сообщения с ярлыком php. Показать все сообщения
Показаны сообщения с ярлыком php. Показать все сообщения

четверг, 9 августа 2007 г.

PHP: методы защиты Вашего скрипта от ботов

Если на Вашем сайте есть формы, которые используются для отправки каких-либо текстовых данных пользователями (как то: гостевые книги, форумы, чаты, формы контактов), рано или поздно Вы столкнётесь со всяческими спам-ботами, которые будут в большом количестве отправлять в формы навязчивую рекламу сайтов их обладателей (ботов, имеется в виду). Есть множество методов, позволяющих предотвратить отправку данных ботами, и в этой статье я опишу несколько таких методов.

Метод #1: Генерация случайного session id

Самый простой, но довольно эффективный метод для избавления от спам-ботов.

Суть метода заключается в том, что в форму добавляется скрытое поле, содержащее случайным образом сгенерированную длинную последовательность символов. При отправке формы её обработчик проверяет session id, и, если он верен, то действие выполняется, если нет, то нет.

Сейчас я объясню, как это реализовать.

Итак, в PHP-код скрипта (в самое начало кода) вставляем несколько строчек:

session_start();
$sid = md5 (rand (100000, 999999));
$_SESSION['sid'] = $sid;


Первая строчка начинает сессию, вторая – генерирует случайную последовательность символов (32-х значную), а третья – сохраняет эту переменную в сессии.

Далее, в HTML-код формы вставляем следующую строчку (естественно, код должен находиться в этом же файле, или в подключаемом):

<input type="hidden" name="sid" value="<?php echo $sid; ?>">

Теперь в PHP-код обработчика вставляем несколько строчек (также, в самое начало кода):

session_start();
if ($_GET['sid'] != $_SESSION['sid']) $sid_error = true;
/* используйте $_POST['sid'] вместо $_GET['sid'] если Вы используете метод передачи POST */
else $sid_error = false;
session_destroy();


Первая и последняя строчки – открывают и уничтожают сессию, остальные – проверяют session id. Если id неправилен, то переменная sid_error имеет значение true, иначе – false. Обработка этой переменной лежит уже на Ваших плечах.

Метод #2: Визуальное подтверждение

В последнее время этот метод защиты от ботов становится всё менее эффективным и всё более раздражающим. Суть заключается в том, что для подтверждения операции пользователь должен ввести код «с картинки».

Данный метод не требует большого кода, но сейчас я обнаружил, что потерял код визуального подтверждения... Точнее, удалил (безвозвратно), поэтому, как реализовать данный метод, сейчас я рассказать не могу. Что ж, расскажу о других.

Метод #3: Текстовое подтверждение

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

Всё очень просто – пользователю показывается код, который он должен повторить. Чаще всего код цифровой, и иногда он записан буквами.

Как реализовать этот метод.

Для начала в PHP-код скрипта (в начало кода) вставляем следующий фрагмент:

session_start();
$confirm_num = rand (100, 999);
$_SESSION['confirm_num'] = $confirm_num;


В форму ввода вставьте такой код:

Введите число в поле справа: <input name="confirm_num" value="" type="text">

Теперь, в PHP-код обработчика вставляем такой код (не забываем о том, что код надо вставить в самое начало):

session_start();
if ($_SESSION['confirm_num'] != $_GET['confirm_num']) $conf_error = true;
/* используйте $_POST['confirm_num'] вместо $_GET['confirm_num'] если Вы используете метод передачи POST */
else $conf_error = false;
session_destroy();


Если код введён верно, то, как Вы наверное, догадались, conf_error имеет значение true, если неверно, то false.

Вроде бы всё, что я хотел рассказать, рассказал. Вообще существует ещё достаточное количество разных методов антибот-защиты (например, запись session id в cookies, проверка http-реферрера, и много ещё чего). Я рассказал только о тех, которые использую сам.

Надеюсь, мои советы помогут Вам противостоять армиям ботов.

Шифрование паролей с использованием md5

Вот решил написать небольшой урок па шифрованию паролей с помощью md5. Читаем.

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

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

Если хакер сумеет скачать файл с паролями или получить их при помощи SQL - инъекции, то он будет иметь неограниченный доступ к администраторской панели или к аккаунтам пользователей.

Поэтому пароли нужно шифровать.

Для шифрования паролей в PHP есть замечательная функция md5. Её преимущество состоит в том, что md5 невозможно расшифровать.

Как же тогда использовать md5 шифрование, если его невозможно расшифровать?

На самом деле, всё очень просто. Просто нужно шифровать в md5 введённый пароль и сверять его с зашифрованным паролем из базы или файла.

Итак, вот пример использования md5. В нашем примере через форму методом POST передаётся пароль, индекс которого - password. Переменная right_pass - это правильный пароль. Вы можете хранить его в файле или MySQL базе. Вот, собственно, код:

$entered_pass = $_POST['password'];
$entered_pass = md5($entered_pass);
if ($right_pass == $entered_pass)
{
echo "Пароль верен";
// Ваш код
}
else
{
echo "Пароль неверен";
// Ваш код
}


Ну вот и всё. Я надеюсь, эта статья поможет Вам в шифровке паролей.