Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
1

Как создать антиспамную защиту для формы?

15.03.2010, 12:46. Показов 1737. Ответов 18
Метки нет (Все метки)

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

заранее благодарен
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2010, 12:46
Ответы с готовыми решениями:

Как создать защиту от дурака в PHP
Нужно чтоб при вводе отрицательных чисел в поля ввода количество товаров и дисконт выдавало ошибку...

Как создать для формы пользовательский интерфейс
День добрый, хотело бы узнать, как украсить форму. Например как сделать меню, как в браузеров, или...

Как создать обработчик события для формы?
как создать обработчик события для формы java?

Как создать красивую кнопку для формы?
Как создать красивую кнопку для формы ?

18
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
15.03.2010, 13:21 2
Может немного горбатый, но вполне рабочий скрипт капчи собственного производства. Как работает можно глянуть здесь:
http://irina-makeup.org.ua/index.php?go=guestbook
Вложения
Тип файла: zip captcha.zip (799 байт, 21 просмотров)
0
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
15.03.2010, 13:22 3
Если возникнут вопросы - отвечу на всё))
0
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
15.03.2010, 17:02  [ТС] 4
Цитата Сообщение от figaro Посмотреть сообщение
Может немного горбатый, но вполне рабочий скрипт капчи собственного производства. Как работает можно глянуть здесь:
http://irina-makeup.org.ua/index.php?go=guestbook
вижу, очень даже в яблочко, только я не очень понимаю как внедрить его в мою форму
вот моя форма
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
 
print ("<form name = \"add\" action = \"receiver.php\" method= \"post\">");
print ("<input type = \"hidden\" name=\"action\" value = \"add\">");
print ("<input type = \"hidden\" name=\"host\" value = \"$_REQUEST[host]\">");
print ("<input type = \"hidden\" name=\"login\" value = \"$_REQUEST[login]\">");
print ("<input type = \"hidden\" name=\"password\" value = \"$_REQUEST[password]\">");
print ("<input type = \"hidden\" name=\"dbName\" value = \"$_REQUEST[dbName]\">");
print ("<input type = \"hidden\" name=\"personsTable\" value = \"$_REQUEST[personsTable]\">");
print ("<input type = \"hidden\" name=\"linksTable\" value = \"$_REQUEST[linksTable]\">");
print ("<input type = \"hidden\" name=\"skillsTable\" value = \"$_REQUEST[skillsTable]\">");
 
$time = date("H:i:s");
print ("<input type = \"hidden\" name=\"time\" value = \"$time\">");
$date = date("Y-n-d");
print ("<input type = \"hidden\" name=\"date\" value = \"$date\">");
 
 
print ("Input your last name:<br>");
print ("<input type = \"text\" name=\"lastName\" value = \"\"size = 30><p>");
 
print ("Input your first name:<br>");
print ("<input type = \"text\" name=\"firstName\" value = \"\" size = 30><p>");
 
print ("Input your patronymic:<br>"); 
print ("<input type = \"text\" name=\"patronymic\" value = \"\"size = 30><p>");
 
print ("Input your E-mail:<br>");
print ("<input type = \"text\" name=\"email\" size = 30 value = \"\"><p>");
 
print ("Experience:<br>");
print ("<select name = \"experience\">");
print ("<option value = \"Less a year\">Less a year</option>");
print ("<option value = \"1-3 years\">1-3 years</option>");
print ("<option value = \"More 5 years\">More 5 years</option>");
print ("<option selected value = \"None\">None</option>");
print ("</select><p>");
 
 
$host = $_REQUEST['host'];
$login = $_REQUEST['login'];
$password = $_REQUEST['password'];
$dbName = $_REQUEST['dbName'];
$skillsTable = $_REQUEST['skillsTable'];
$connect = mysql_connect($host, $login, $password) or die("Can not connect to DB.");
mysql_select_db($dbName,$connect)or die("Can not connect to base $dbName");
$query = "SELECT * FROM $skillsTable";
$result = mysql_query($query);
$count = mysql_num_rows($result);
print ("Skills:<br>");
print ("<select name = \"skills[]\" multiple size = \"3\">");
for($i=0;$i<$count;$i++){
 
    $skill = mysql_result($result,$i,'skill');
    $id_skill = mysql_result($result,$i,'id');
    print ("<option value = \"$id_skill\">$skill</option>");
}
mysql_close($connect);
print ("</select><p>");
 
print ("Coments:<br>");
print ("<textarea name = \"coments\" rows = 10 cols = 50>");
print ("</textarea><p>");
print ("<input type = \"submit\" name=\"submit\" value = \"Add new person\" > ");
print ("<input type = \"reset\" value = \"reset\" > ");
print ("</form>");
?>
как мне ее туда вставить или что мне сделать?
как оно вообще делается?
0
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
15.03.2010, 18:08 5
Используя ваш код, то должно получиться как-то вот так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
include_once('captcha.php');
if(isset($_REQUEST['mycpt']) && !captcha_verify()) die("Введены неправильные символы с картинки");
print ("<form name = \"add\" action = \"receiver.php\" method= \"post\">");
print ("<input type = \"hidden\" name=\"action\" value = \"add\">");
print ("<input type = \"hidden\" name=\"host\" value = \"$_REQUEST[host]\">");
print ("<input type = \"hidden\" name=\"login\" value = \"$_REQUEST[login]\">");
print ("<input type = \"hidden\" name=\"password\" value = \"$_REQUEST[password]\">");
print ("<input type = \"hidden\" name=\"dbName\" value = \"$_REQUEST[dbName]\">");
print ("<input type = \"hidden\" name=\"personsTable\" value = \"$_REQUEST[personsTable]\">");
print ("<input type = \"hidden\" name=\"linksTable\" value = \"$_REQUEST[linksTable]\">");
print ("<input type = \"hidden\" name=\"skillsTable\" value = \"$_REQUEST[skillsTable]\">");
 
$time = date("H:i:s");
print ("<input type = \"hidden\" name=\"time\" value = \"$time\">");
$date = date("Y-n-d");
print ("<input type = \"hidden\" name=\"date\" value = \"$date\">");
 
 
print ("Input your last name:<br>");
print ("<input type = \"text\" name=\"lastName\" value = \"\"size = 30><p>");
 
print ("Input your first name:<br>");
print ("<input type = \"text\" name=\"firstName\" value = \"\" size = 30><p>");
 
print ("Input your patronymic:<br>"); 
print ("<input type = \"text\" name=\"patronymic\" value = \"\"size = 30><p>");
 
print ("Input your E-mail:<br>");
print ("<input type = \"text\" name=\"email\" size = 30 value = \"\"><p>");
 
print ("Experience:<br>");
print ("<select name = \"experience\">");
print ("<option value = \"Less a year\">Less a year</option>");
print ("<option value = \"1-3 years\">1-3 years</option>");
print ("<option value = \"More 5 years\">More 5 years</option>");
print ("<option selected value = \"None\">None</option>");
print ("</select><p>");
print ("Введите код на картинке:<br />");
print ("<img src='captcha.php?rand=".rand(1000, 9999)."' />:<br />");
print ("<input type='text' name='mycpt' />:<br />");
 
$host = $_REQUEST['host'];
$login = $_REQUEST['login'];
$password = $_REQUEST['password'];
$dbName = $_REQUEST['dbName'];
$skillsTable = $_REQUEST['skillsTable'];
$connect = mysql_connect($host, $login, $password) or die("Can not connect to DB.");
mysql_select_db($dbName,$connect)or die("Can not connect to base $dbName");
$query = "SELECT * FROM $skillsTable";
$result = mysql_query($query);
$count = mysql_num_rows($result);
print ("Skills:<br>");
print ("<select name = \"skills[]\" multiple size = \"3\">");
for($i=0;$i<$count;$i++){
 
        $skill = mysql_result($result,$i,'skill');
        $id_skill = mysql_result($result,$i,'id');
        print ("<option value = \"$id_skill\">$skill</option>");
}
mysql_close($connect);
И еще я немного подрихтовал скрипт под вас... Ловите. Не забудте подкинуть файл со шрифтом в ту же папку, где и сам скрипт.
Вложения
Тип файла: zip captcha.zip (59.2 Кб, 19 просмотров)
0
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
15.03.2010, 18:55  [ТС] 6
а как мне обрабатывать результат
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
 
if($_REQUEST['action']=="add"){
    $validData = true;
    $time = trim($_REQUEST['time']);
    $date = trim($_REQUEST['date']);
    $lastName = trim($_REQUEST['lastName']);
    if(captcha_verify()){
        $validData = false;
        print ("Please input corect simbols.<br>");
    }
    if($lastName == ""){
        $validData = false;
        print ("A last name has not been inputted. Please input your last name.<br>");
    }
    $firstName = trim($_REQUEST['firstName']);
    if($firstName == ""){
        $validData = false;
        print ("A first name has not been inputted. Please input your first name.<br>");
    }
вот часть кода где я обрабатываю но не знаю как обработать рисунок, результаты ввода он в какой-то переменной или нужно вызывать функцию function captcha_verify() а то я не очень сильный в чужих кодах.
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
15.03.2010, 21:17 7
Скрипт капчи должен помещать в переменную сессии тот, текст, который выводиться на картинке. На странице проверки данных из формы сравнивай переданный POST и значение из капчи, если идентичны, то бацай дальше, если нет, то выводи ошибку. Но в капче уже включена походу эта проверка, единственное что изменил бы, так это == на ===
0
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
15.03.2010, 21:43  [ТС] 8
Цитата Сообщение от romchiksoad Посмотреть сообщение
Скрипт капчи должен помещать в переменную сессии тот, текст, который выводиться на картинке. На странице проверки данных из формы сравнивай переданный POST и значение из капчи, если идентичны, то бацай дальше, если нет, то выводи ошибку. Но в капче уже включена походу эта проверка, единственное что изменил бы, так это == на ===
почему, что это означает?
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
15.03.2010, 23:19 9
== значит равно;
=== значит идентично.
мне кажется, что так надежнейно вообще особой разницы нету
0
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
15.03.2010, 23:24 10
Немного подкорректировал...
Итак, нохайнмаль!
Наша форма:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
print ("<form name = \"add\" action = \"receiver.php\" method= \"post\">");
print ("<input type = \"hidden\" name=\"action\" value = \"add\">");
print ("<input type = \"hidden\" name=\"host\" value = \"$_REQUEST[host]\">");
print ("<input type = \"hidden\" name=\"login\" value = \"$_REQUEST[login]\">");
print ("<input type = \"hidden\" name=\"password\" value = \"$_REQUEST[password]\">");
print ("<input type = \"hidden\" name=\"dbName\" value = \"$_REQUEST[dbName]\">");
print ("<input type = \"hidden\" name=\"personsTable\" value = \"$_REQUEST[personsTable]\">");
print ("<input type = \"hidden\" name=\"linksTable\" value = \"$_REQUEST[linksTable]\">");
print ("<input type = \"hidden\" name=\"skillsTable\" value = \"$_REQUEST[skillsTable]\">");
 
$time = date("H:i:s");
print ("<input type = \"hidden\" name=\"time\" value = \"$time\">");
$date = date("Y-n-d");
print ("<input type = \"hidden\" name=\"date\" value = \"$date\">");
 
 
print ("Input your last name:<br>");
print ("<input type = \"text\" name=\"lastName\" value = \"\"size = 30><p>");
 
print ("Input your first name:<br>");
print ("<input type = \"text\" name=\"firstName\" value = \"\" size = 30><p>");
 
print ("Input your patronymic:<br>"); 
print ("<input type = \"text\" name=\"patronymic\" value = \"\"size = 30><p>");
 
print ("Input your E-mail:<br>");
print ("<input type = \"text\" name=\"email\" size = 30 value = \"\"><p>");
 
print ("Experience:<br>");
print ("<select name = \"experience\">");
print ("<option value = \"Less a year\">Less a year</option>");
print ("<option value = \"1-3 years\">1-3 years</option>");
print ("<option value = \"More 5 years\">More 5 years</option>");
print ("<option selected value = \"None\">None</option>");
print ("</select><p>");
 
$host = $_REQUEST['host'];
$login = $_REQUEST['login'];
$password = $_REQUEST['password'];
$dbName = $_REQUEST['dbName'];
$skillsTable = $_REQUEST['skillsTable'];
$connect = mysql_connect($host, $login, $password) or die("Can not connect to DB.");
mysql_select_db($dbName,$connect)or die("Can not connect to base $dbName");
$query = "SELECT * FROM $skillsTable";
$result = mysql_query($query);
$count = mysql_num_rows($result);
print ("Skills:<br>");
print ("<select name = \"skills[]\" multiple size = \"3\">");
for($i=0;$i<$count;$i++){
 
        $skill = mysql_result($result,$i,'skill');
        $id_skill = mysql_result($result,$i,'id');
        print ("<option value = \"$id_skill\">$skill</option>");
}
mysql_close($connect);
print ("</select><p>");
 
print ("Coments:<br>");
print ("<textarea name = \"coments\" rows = 10 cols = 50>");
print ("</textarea><p>");
 
// Наша капча
print ("Введите код на картинке:<br />");
print ("<img src='captcha.php?rand=".rand(1000, 9999)."' />:<br />");
print ("<input type='text' name='mycpt' />");
// Её конец
 
print ("<input type = \"submit\" name=\"submit\" value = \"Add new person\" > ");
print ("<input type = \"reset\" value = \"reset\" > ");
print ("</form>");
receiver.php:
PHP
1
2
3
4
5
include_once('captcha.php');
if($_REQUEST['action']=="add")
{
  if(isset($_REQUEST['mycpt']) && !captcha_verify()) die("Введены неправильные символы с картинки");
  ...
И погнал дальше делать свою проверку по остальным полям...

Немного объясню как работает капча, так как скорее всего этот вопрос у многих возникнет))
Капча вставляется в код страницы путем вставки ссылки на сам скрипт капчи в тег img. Функция ответственная за вывод картинки (captcha_put()) кроме вывода на страницу картинки с набором символов пишет в переменную сессии значение этого набора символов, которое изображено на картинке. Замечу что в ссылке на капчу присутствует параметр rand со случайным числом. Это необходимо для того чтобы браузер не выдавал одну и ту же им закешированную картинку.
Далее пользователь вписывает в поле <input type='text' name='mycpt' /> эти символы, которые в последующем передадутся на сервер скрипту receiver.php, в котором на 4-ой строчке функцией captcha_verify() происходит проверка на правильность ввода капчи.
0
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
16.03.2010, 01:41  [ТС] 11
возникает проблема с сессиями
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Q:\home\localhost\www\work\receiver.php:6) in Q:\home\localhost\www\work\captcha.php on line 2
вот ошибка которую выводит браузер когда открывается после нажатия сабмит переход на receiver.php что тут можно сделать, нужно убрать сессию с файла captcha.php ? или как ее решить?
0
1957 / 796 / 89
Регистрация: 03.11.2009
Сообщений: 3,066
Записей в блоге: 2
16.03.2010, 21:57 12
что у тебя в 6 строке reciver.php?
попробуй из capcha.php удалить, а в reciver.php вставить в самом начале, до инклуда capcha.php
0
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
16.03.2010, 22:28 13
Цитата Сообщение от andrii Посмотреть сообщение
нужно убрать сессию с файла captcha.php ?
Ничего из captcha.php удалять не нужно! Тем более что-то переделівать! Все там прекрасно работает! Покажи лучше что у тебя идет до 6-ой строки включительно в reciver.php. Сейчас разберемся!
0
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
17.03.2010, 01:17  [ТС] 14
Цитата Сообщение от figaro Посмотреть сообщение
Ничего из captcha.php удалять не нужно! Тем более что-то переделівать! Все там прекрасно работает! Покажи лучше что у тебя идет до 6-ой строки включительно в reciver.php. Сейчас разберемся!
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<html>
<head>
<title>receive</title>
</head>
<body>
<?php
 
if($_REQUEST['action']=="add"){
    $validData = true;
    $time = trim($_REQUEST['time']);
    $date = trim($_REQUEST['date']);
    $lastName = trim($_REQUEST['lastName']);
    include_once('captcha.php');
    if(isset($_REQUEST['mycpt']) && !captcha_verify()) die("Введены неправильные символы с картинки");
    if($lastName == ""){
        $validData = false;
        print ("A last name has not been inputted. Please input your last name.<br>");
    }
    $firstName = trim($_REQUEST['firstName']);
    if($firstName == ""){
        $validData = false;
        print ("A first name has not been inputted. Please input your first name.<br>");
    }
    $patronymic = trim($_REQUEST['patronymic']);
    if($patronymic == ""){
        $validData = false;
        print ("A patronymic has not been inputted. Please input your patronymic.<br>");
    }
вот начало файла. я так понимаю что нужно открыть сессию или что-то там, просто с сессиями никогда не работал
0
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
17.03.2010, 01:41 15
Цитата Сообщение от andrii Посмотреть сообщение
<html>
<head>
<title>receive</title>
</head>
<body>
Поставь эти теги после того как все заголовки отправятся!
Или вообще убери
0
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
17.03.2010, 02:26  [ТС] 16
Цитата Сообщение от figaro Посмотреть сообщение
Поставь эти теги после того как все заголовки отправятся!
Или вообще убери
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
 
if($_REQUEST['action']=="add"){
    $validData = true;
    $time = trim($_REQUEST['time']);
    $date = trim($_REQUEST['date']);
    $lastName = trim($_REQUEST['lastName']);
    include_once('captcha.php');
    
    if(isset($_REQUEST['mycpt']) && !captcha_verify()) die("Введены неправильные символы с картинки");
    if($lastName == ""){
        $validData = false;
        print ("A last name has not been inputted. Please input your last name.<br>");
    }
теперь вот так оно, но ошибка остается
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Q:\home\localhost\www\work\receiver.php:2) in Q:\home\localhost\www\work\captcha.php on line 2
надо ж как-то открыть сессию или нет, я ж ее создаю, надо сохранить и открыть... я так понимаю что оно опять пытается создать уже созданное
0
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
17.03.2010, 09:47 17
Подозреваю что у тебя первая строка стоит пустая, а со второй начинается код. Это тоже означает, что в браузер пошли данные, после чего про отсылание заголовков можешь забыть. Посмотри внимательно, есть ли перед <?php пробелы или переводы строки. Если есть, то удаляй.
0
185 / 185 / 53
Регистрация: 10.04.2009
Сообщений: 491
17.03.2010, 10:31  [ТС] 18
Цитата Сообщение от figaro Посмотреть сообщение
Подозреваю что у тебя первая строка стоит пустая, а со второй начинается код. Это тоже означает, что в браузер пошли данные, после чего про отсылание заголовков можешь забыть. Посмотри внимательно, есть ли перед <?php пробелы или переводы строки. Если есть, то удаляй.
все теперь работает
это получается, что нужно считывать сессию перед формированием нтмл кода, а он начинал формироваться еще с того пустого места перед рнр кодом?
0
43 / 41 / 4
Регистрация: 10.03.2010
Сообщений: 196
17.03.2010, 10:39 19
Цитата Сообщение от andrii Посмотреть сообщение
а он начинал формироваться еще с того пустого места перед рнр кодом?
Там не пустое место, там у тебя стояли как минимум символ|ы перевода каретки. Перед отправкой заголовков (установкой кукисов, Content-type и т. д.) никаких символов, тегов и пр., связанных с выводом информации в браузер стоять не должно!
1
17.03.2010, 10:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2010, 10:39
Помогаю со студенческими работами здесь

Как создать формы публикаций для обычных пользователей
Добрый день всем Я новичок в worldpress поэтому хочу спросить. Как мне создать собственные формы...

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

Как создать свою иконку для своего элемента управления формы?
Как создать свою иконку для своего элемента управления формы?

Как написать защиту от некорректного ввода для моей проги?
void task_1(int **A, int M, int N) { int i=0, sum=0; //1.) сумму элементов в тех строках,...

Как создать правило для формы вбиваемое количество может быть не больше количества в наличии?
Добрый день, всем! Подскажите, пожалуйста, новичку. Есть написанная мной база для склада,...

Как сделать по возможности максимально универсальную защиту от дурака для ввода целых положительных чисел?
Добрый день! Хотел бы спросить, как сделать по возможности максимально универсальную защиту от...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru