|
|
|
|
|
для: technic611
(05.03.2006 в 04:47)
| | Теперь я повысил уровень защиты и количество спама обязательно уменьшится.
Большое спасибо за советы | |
|
|
|
|
|
|
|
для: Владимир55
(04.03.2006 в 22:37)
| | Да непоможет ставил я уже такую опцию, находится она в Правах доступа. Все равно будут регистрироваться и слать, пока хорошую защиту не сделать.
Например изменить action, пути
Можно генерировать картинки с кодом, хоят слышал что из спам боты их могут обходить.
Вот что я нашел на одном из форумов посвященных этой теме. Может поможет
Заголовок сообщения: PHP. Пишем защиту от регистраций ботов.
Итак, сегодня поговорим о защите своих сайтов/форумов/гостевых и т.д. от регистраций и постоянных реклам ботов.
Все, что нам понадобится, - php и прямые руки. Ну, и может быть еще какая-нибудь программа для рисования.
Писать защиту будем с использованием сессий. По-моему, это самый оптимальный вариант для небольших и средних проектов. Конечно, можно делать и с использованием базы данных, но этого мы делать не будем. Начнем...
Для начала напишем простой скрипт, который будет генерировать совершенно случайную надпись. Если вы хотите использовать только цифры, то решается все очень просто:
Код:
<?php
$string = mt_rand(10000,99999); // случайное число
?>
И все... А если буквы, то это тоже очень легко, просто немного больше кода:
Код:
<?php
$letters = 'abcdifghijklnmopqrstuvwxyz'; // строка символов
$chars = array();
$string = '';
for ($i=0;$i<strlen($letters);$i++)
{
$chars[] = substr($letters,$i,1); // массив всех символов
}
$length = 5;
for ($i=0;$i<$length;$i++)
{
$char = mt_rand(0,count($chars)-1); // генерация случайного номера символа из массива
$string .= $chars[$char]; // добавление случайного символа к строке
}
?>
|
В итоге, $string - это наша случайная строка. В общем, при ее формировании можно извращаться, насколько хватит фантазии. При желании можно добавить туда и цифры, и заглавные буквы, и специальные символы.
Идем дальше. Теперь напишем формочку с для отображения картинки и ввода строки. И с самого начала стартуем сессию и генерируем строку.
Код:
<?php
session_start(); // наша сессия
$letters = 'abcdifghijklnmopqrstuvwxyz';
$chars = array();
$string = '';
for ($i=0;$i<strlen($letters);$i++)
{
$chars[] = substr($letters,$i,1);
}
$length = 5;
for ($i=0;$i<$length;$i++)
{
$char = mt_rand(0,count($chars)-1);
$string .= $chars[$char];
}
$_SESSION['string'] = $string; // передача случайной строки в сессию
?>
<form action="verify.php" method="post">
<img src="img.php" alt="Anti-bot"><br>
<input type="text" name="userstring"><br>
<input type="submit" name="verify" value=" send ">
</form>
|
А теперь приступаем к самому интересному - пишем код самой картинки, т.е. скрипт img.php.
Код:
<?php
session_start();
$img = imagecreate(200,80); // создаем изображение размером 200х80
$black = imagecolorallocate($img,0,0,0); // определяем черный цвет
$white = imagecolorallocate($img,255,255,255); // белый цвет
imagefill($img,0,0,$white); // заполняем изображение белым
imagettftext($img,38,0,4,60,$black,'arial.ttf',$_SESSION['string']); // пишем строку из сессии черным цветом
imagepng($img); // отдаем картинку в браузер
imagedestroy($img); // удаляем ее из памяти
header('Content-Type: image/png'); // даем знать браузеру, что это картинка png
?>
Это пример, самой простой картинки, которая напишет нашу случайную строку на белом фоне. Важно: тут я использовал шрифт arial.ttf, вместо стандартных, для этого нужен сам файл шрифта, который будет лежать в одной директории со скриптом и поддержка функции imagettftext в php.
Но ведь есть боты, которым по силам прочитать такое, а мы этого не хотим, ведь так?
Извращаемся дальше - создадим небольшой шум.
Код:
<?php
session_start();
$img = imagecreate(200,80);
$black = imagecolorallocate($img,0,0,0);
$white = imagecolorallocate($img,255,255,255);
imagefill($img,0,0,$white);
imagettftext($img,38,0,4,60,$black,'arial.ttf',$_SESSION['string']);
$p = 0;
while ($p<1000)
{
$x = mt_rand(1,199); // случайная координата пикселя шума по оси X
$y = mt_rand(1,79); // ось Y
$pixel = imagecolorat($img,$x,$y); // узнаем какой цвет используется на месте будущего пикселя шума
$point = ($pixel == $black) ? $white : $black; // если был черный, красим пиксель белым, если белый - красим черным
imagesetpixel($img,$x,$y,$point); // рисуем сам пиксель
$p++;
}
imagepng($img);
imagedestroy($img);
header('Content-Type: image/png');
?>
|
Получились небольшие помехи на картинке, называемые шумом. Число в цикле можно увеличивать - только не перестарайтесь, чтобы не слишком загружать сервер и, конечно же, чтобы сама строка на картинке была видна.
Теперь сделаем разноцветный фон. Его можно нарисовать в любой программе для рисования, хотя бы даже в paint. А потом укажем в скрипте путь до этого изображения и применим как фон. Вот так:
Код:
<?php
session_start();
$img = imagecreatefrompng('ourpicture.png'); // создаем изобажение из уже существующего в формате png
$black = imagecolorallocate($img,0,0,0);
$white = imagecolorallocate($img,255,255,255);
imagettftext($img,38,0,4,60,$black,'arial.ttf',$_SESSION['string']);
$p = 0;
while ($p<1000)
{
$x = mt_rand(1,199);
$y = mt_rand(1,79);
$pixel = imagecolorat($img,$x,$y);
$point = ($pixel == $black) ? $white : $black;
imagesetpixel($img,$x,$y,$point);
$p++;
}
imagepng($img);
imagedestroy($img);
header('Content-Type: image/png');
?>
|
Получим картинку с надписью и шумом на нашем фоне. Замечу, что картинку я создавал в формате png, поэтому и функцию php использовал соответствующую - imagecreatefrompng. Для других форматов изображений есть и другие функции.
Все способы рисования защиты я показывать не буду - фантазируйте и создавайте сами. Просто на словах скажу, что можно еще нашу строку накладывать на саму себя, но с небольшим смещением, - опять же получится небольшое искажение. Или же каждый символ строки смещать по осям X и Y, даже окрашивать их в разные цвета. Можно выводить и какое-то математическое действие, как, например, сделано на нашем сайте при регистрации. Также можно писать случайное число прописью, что существенно усложнит жизнь ботам.
И, наконец, мы дошли до последнего скрипта - скрипта проверки введенной строки, verify.php.
Код:
<?php
session_start();
if (!empty($_POST['userstring'])) die('Вы ничего не написали!'); // проверяем введенную строку пользователем
if ($_POST['userstring'] === $_SESSION['string']) echo 'Строка введена правильно.'; // проверяем идентичность и даем ответ
else echo 'Строка введена неправильно!';
?>
|
| |
|
|
|
|
|
|
|
для: Владимир55
(04.03.2006 в 22:37)
| | Когда создаешь новый форум, то выбираешь, кто может там писать, все или пользователи, а пользователи это и есть зарегистрированные. | |
|
|
|
|
|
|
|
для: JIEXA
(04.03.2006 в 22:32)
| | Вот что это за опция?
Я знаю панель "Общие настройки". Там есть "Включить активизацию учётных записей". Я включил и при регистрации нового пользователя ему посылается письмо, что для робота является некоторой преградой (можно и админу направлять, но я пока не об этом).
Но ведь можно и вообще не регистрироваться, а писать прямо так! Вот как отключить эту возможность писать без регистрации? | |
|
|
|
|
|
|
|
для: Владимир55
(04.03.2006 в 22:20)
| | > Можно ли на движке этого типа сделать так, чтобы создание учетной записи было обязательным?
в админ панеле есть опции такая, где точно, не помню
> Такое возможно? Вероятно, через прокси?
через прокси 100% | |
|
|
|
|
|
|
| Какой-то настойчивый спамер попался - сыпет и сыпет одно и тоже объявление во все разделы. Сначала я терпеливо их удалял, потом стал ставить запрет на его адрес и тут увидел, что у каждого сообщения свой адрес!
Такое возможно? Вероятно, через прокси?
Сейчас собрал коллекцию запрещенных мною адресов, но спамеров это совершенно не смущает!
Слышал, что можно что-то сделать через куки. Если б я ещё знал, что это такое, то может бы и сделал...
И ещё.
Можно ли на движке этого типа сделать так, чтобы создание учетной записи было обязательным? А то многие не регистрируются вообще, пишут "Гость" или любой ник, и лепят, что попало... | |
|
|
| |
|