Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 62

Проблемы с куками

04.02.2020, 15:57. Показов 2551. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно, чтобы пользователь мог отправлять форму только 2 раза. Но это не работает. Почему? Как исправить?

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
$errors = [];
if (isset($_POST['email'])) {
    foreach ($_POST as $key => $value) {
        if (trim($value) == '') {
            $errors[$key] = 'Не заполнено поле '.$key;
        } else {
            if ($key == 'age') {
                if (strval(intval($value)) != $value) {
                    $errors[$key] = 'Неправильно указан возраст';
                }
                $age = intval($value);
            } elseif ($key == 'email') {
                if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                    $errors[$key] = 'Неправильно указан email';
                }
                $email = filter_var($value, FILTER_SANITIZE_EMAIL);
            } else {
                $$key = htmlentities($value, ENT_QUOTES, 'utf-8');
            }
        }
    }
    // разрешенные расширения файлов
    $fname = pathinfo($_FILES["file"]["name"])['filename'];
    $ext = strtolower(pathinfo($_FILES["file"]["name"])['extension']);
    $allowed_ext = ['pdf', 'png', 'jpg', 'jpeg']; 
    $type = explode('/', $_FILES["file"]["type"]);
    if ($type[0] != 'image' || !in_array($ext, $allowed_ext)) {
        $errors['file'] = $fname.'Можно загружать файлы только в формате pdf, png, jpg, jpeg';
    }
            
    if (!count($errors)) {
        
        if ($age == 5 || $age == 6) {
            $mailto = "pomnipobedu5-6@yandex.ru";
        } elseif ($age >= 7 && $age <= 9) {
            $mailto = "pomnipobedu7-9@yandex.ru";
        } elseif ($age >= 10 && $age <= 12) {
            $mailto = "pomnipobedu10-12@yandex.ru";
        } elseif ($age == 13 || $age == 14) {
            $mailto = "pomnipobedu13-14@yandex.ru";
        } elseif ($age >= 15 && $age <= 18) {
            $mailto = "pomnipobedu15-18@yandex.ru";
        } else {
            echo ("Простите вы не подходите по возрасту");
        }
        
        $from_mail = "mail1@mail.ru";
        $replyto = "mail2@mail.ru";
        $from_name = "My site service";
        $subject = 'Сообщение с сервиса';
        $subject= '=?utf-8?B?' . base64_encode($subject) . '?=';
        $message = "Фамилия:".$surname.".<br/>
            Имя: ".$name. ".<br/>
            Название работы: ".$workname. ".<br/>
            Телефон: ".$tel. ".<br/>
            E-mail: ".$email. ".<br/>
            Возраст: ".$age. ".<br/>
            Населенный пункт: ".$sity."<br/>";
        $filename = 'image'.uniqid().'.'.$ext;
        $content = chunk_split(base64_encode(file_get_contents($_FILES["file"]["tmp_name"])));
        $uid = md5(uniqid(time()));
        $header = "From: " . $from_name . " <" . $from_mail . ">\r\n";
        $header .= "Reply-To: " . $replyto . "\r\n";
        $header .= "MIME-Version: 1.0\r\n";    
        $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
        $body = "This is a multi-part message in MIME format.\r\n";
        $body .= "--" . $uid . "\r\n";
        $body .= "Content-type:text/html; charset=utf-8\n";
        $body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $body .= "<div>" . $message . "</div>\r\n\r\n";
 
        $body .= "--" . $uid . "\r\n";
        $body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\r\n"; // use different content types here
        $body .= "Content-Transfer-Encoding: base64\r\n";
        $body .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n\r\n"; // For Attachment
        $body .= $content . "\r\n\r\n";
        $body .= "--" . $uid . "--";
        if (mail($mailto, $subject, $body, $header)) {
            if (!isset($_COOKIE['count'])) {
                $count = 0;    
            } elseif (isset($_COOKIE['count'])) $count = $_COOKIE['count'] && $count < 2;
                $count++;
                setcookie("count", $count, 60*60*24*365, true);
                header('Location: loading.html');
            } elseif($count = 2) {
                print "На конкурс можно отправить только две работы";
            } else {
            echo "<p>Письмо не удалось отправить</p><pre>";
            print_r(error_get_last());
            echo '</pre>';
        }
    } else {
        echo '<p>Неправильно заполнена форма:</p>';
        foreach ($errors as $field => $error) {
            echo 'Поле '.$field.': '.$error.'<br/>';
        }
    }
}
?>
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.02.2020, 15:57
Ответы с готовыми решениями:

Проблемы с куками
Здравствуйте! Работаю в малоизвестном фреймворке, и задачей является на страницах-записей добавлять данные в куки. Записи находятся в...

Непонятки с Куками
Добрый вечер... Снова прошу помощи знатоков. Есть сайт...и возникла необходимость в добавлении второго языка. база с таблице в ней...

Работа с куками
Здравствуйте. Нужна помощь по работе с куками. &lt;?php $city = $_GET; setcookie(&quot;city&quot;, $city, time()+3600, &quot;/&quot;); ...

25
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.02.2020, 16:17
Steisi1982, куки работают на странице, пока ничего не выводится в браузер. вместо кук лучше используйте $_SESSION. в Вашем случае советовал бы так (код вставьте вместо 1-3 строк Вашего кода):
PHP
1
2
3
4
5
6
7
8
9
10
<?php
$errors = [];
if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
}
if ($_SESSION['count'] > 2) {
    $errors['count'] = 'На конкурс можно отправить только две работы';
}
if (isset($_POST['email']) && $_SESSION['count'] < 2) {
// дальше сам код
а строки 80-87 замените этой:
PHP
1
2
3
$_SESSION['count']++;
header('Location: loading.html');
exit;
Добавлено через 4 минуты
имеет смысл в таком случае при $_SESSION['count'] > 2 вообще не показывать форму отправки данных, а вместо формы показывать сообщение
HTML5
1
</p>На конкурс можно отправить только две работы</p>
0
1 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 62
04.02.2020, 16:38  [ТС]
Мне нужно чтобы в куках учитывалось только число успешно отправленных форм. Мне кажется Ваш код работает несколько иначе. Или я ошибаюсь? Прошу прощения за глупый вопрос. Я только учусь
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.02.2020, 16:44
если Вы заменили строки 80-87 теми, какие там написаны, то $_SESSION['count'] увеличивается на 1 с каждой успешно отправленной формой, значит делает то, что нужно. перенес проверку этого счетчика до обработки $_POST, чтобы его впустую не обрабатывать, если форма была отправлена более 2 раз - все равно данные не отправятся.
0
1 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 62
04.02.2020, 16:57  [ТС]
Ясно. Спасибо огромное. Попробую

Добавлено через 11 минут
Не получается. Можно отправить форму и 3, и 4 раза. Может я что-то не туда вставила?

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
$errors = [];
if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
}
if ($_SESSION['count'] > 2) {
    $errors['count'] = 'На конкурс можно отправить только две работы';
}
if (isset($_POST['email']) && $_SESSION['count'] < 2) {
    foreach ($_POST as $key => $value) {
        if (trim($value) == '') {
            $errors[$key] = 'Не заполнено поле '.$key;
        } else {
            if ($key == 'age') {
                if (strval(intval($value)) != $value) {
                    $errors[$key] = 'Неправильно указан возраст';
                }
                $age = intval($value);
            } elseif ($key == 'email') {
                if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                    $errors[$key] = 'Неправильно указан email';
                }
                $email = filter_var($value, FILTER_SANITIZE_EMAIL);
            } else {
                $$key = htmlentities($value, ENT_QUOTES, 'utf-8');
            }
        }
    }
    // разрешенные расширения файлов
    $fname = pathinfo($_FILES["file"]["name"])['filename'];
    $ext = strtolower(pathinfo($_FILES["file"]["name"])['extension']);
    $allowed_ext = ['pdf', 'png', 'jpg', 'jpeg']; 
    $type = explode('/', $_FILES["file"]["type"]);
    if ($type[0] != 'image' || !in_array($ext, $allowed_ext)) {
        $errors['file'] = $fname.'Можно загружать файлы только в формате pdf, png, jpg, jpeg';
    }
            
    if (!count($errors)) {
        
        if ($age == 5 || $age == 6) {
            $mailto = "pomnipobedu5-6@yandex.ru";
        } elseif ($age >= 7 && $age <= 9) {
            $mailto = "pomnipobedu7-9@yandex.ru";
        } elseif ($age >= 10 && $age <= 12) {
            $mailto = "pomnipobedu10-12@yandex.ru";
        } elseif ($age == 13 || $age == 14) {
            $mailto = "pomnipobedu13-14@yandex.ru";
        } elseif ($age >= 15 && $age <= 18) {
            $mailto = "pomnipobedu15-18@yandex.ru";
        } else {
            echo ("Простите вы не подходите по возрасту");
        }
        
        $from_mail = "mail1@mail.ru";
        $replyto = "mail2@mail.ru";
        $from_name = "My site service";
        $subject = 'Сообщение с сервиса';
        $subject= '=?utf-8?B?' . base64_encode($subject) . '?=';
        $message = "Фамилия:".$surname.".<br/>
            Имя: ".$name. ".<br/>
            Название работы: ".$workname. ".<br/>
            Телефон: ".$tel. ".<br/>
            E-mail: ".$email. ".<br/>
            Возраст: ".$age. ".<br/>
            Населенный пункт: ".$sity."<br/>";
        $filename = 'image'.uniqid().'.'.$ext;
        $content = chunk_split(base64_encode(file_get_contents($_FILES["file"]["tmp_name"])));
        $uid = md5(uniqid(time()));
        $header = "From: " . $from_name . " <" . $from_mail . ">\r\n";
        $header .= "Reply-To: " . $replyto . "\r\n";
        $header .= "MIME-Version: 1.0\r\n";    
        $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
        $body = "This is a multi-part message in MIME format.\r\n";
        $body .= "--" . $uid . "\r\n";
        $body .= "Content-type:text/html; charset=utf-8\n";
        $body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $body .= "<div>" . $message . "</div>\r\n\r\n";
 
        $body .= "--" . $uid . "\r\n";
        $body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\r\n"; // use different content types here
        $body .= "Content-Transfer-Encoding: base64\r\n";
        $body .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n\r\n"; // For Attachment
        $body .= $content . "\r\n\r\n";
        $body .= "--" . $uid . "--";
        if (mail($mailto, $subject, $body, $header)) {
           $_SESSION['count']++;
           header('Location: loading.html');
           exit;
        } else {
            echo "<p>Письмо не удалось отправить</p><pre>";
            print_r(error_get_last());
            echo '</pre>';
        }
    } else {
        echo '<p>Неправильно заполнена форма:</p>';
        foreach ($errors as $field => $error) {
            echo 'Поле '.$field.': '.$error.'<br/>';
        }
    }
}
?>
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.02.2020, 17:37
попробуйте поставить самые первые строчки (в последнем скрипте):
PHP
1
2
3
4
<?php
if (!ini_get('session.auto_start')) {
    session_start();
}
пишите о результатах
0
Невнимательный
 Аватар для ft4l
3114 / 1294 / 359
Регистрация: 08.02.2013
Сообщений: 7,573
Записей в блоге: 2
04.02.2020, 17:45
PHP
1
session_start ([ array $options = array() ] ) : bool
не хватает , до любого использования $_SESSION

Вариант с сессиями по умолчанию убивает сессию после 24-х минут
в течении которых не вызывалось session_start() для текущей сессии

Не по теме:

если не определите свои значения session.gc_maxlifetime и session.save_path
возможно иногда есть смысл менять ещё session.cookie_lifetime - 0 по умолчанию

0
1 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 62
04.02.2020, 17:58  [ТС]
После двух успешных отправок форм выполняется перенаправление на пустой файл send.php
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
04.02.2020, 19:16
Steisi1982, я был неправ. в Вашем случае нужны куки, потому что их можно хранить дольше, а сессии - они только до 24 минут после закрытия сайта. возвращайтесь к своему скрипту с куками. и там надо так поправить для кук:
PHP
1
2
3
4
5
6
7
8
9
<?php
$count = 0;
if (isset($_COOKIE['count'])) {
   $count = intval($_COOKIE['count']); 
}
if ($count > 2) {
    $errors['counter'] = 'На конкурс можно отправить только две работы';
}
if (isset($_POST['email']) && $count < 2) {
а строки 80-91 заменить этими
PHP
1
2
3
4
$count++;
setcookie("count", $count, time() + 60*60*24*365);
header('Location: loading.html');
exit;
Цитата Сообщение от Steisi1982 Посмотреть сообщение
перенаправление на пустой файл
файл loading.html в корне сайта находится? надо указать реальный url к этому файлу

Добавлено через 19 минут
и еще все строки, начиная с 93 (где } else {), перепишите так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
    }
}    
if (count($errors)) {
    echo '<p>Ошибка отправки формы:</p>';
    foreach ($errors as $field => $error) {
        if ($field == 'counter') {
            echo $error.'<br/>';
        } else {
            echo 'Поле '.$field.': '.$error.'<br/>';
        }        
    }
}
0
1 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 62
04.02.2020, 21:49  [ТС]
По-моему я что-то напутала. Код должен заканчиваться так?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        if (mail($mailto, $subject, $body, $header)) {
            $count++;
            setcookie("count", $count, time() + 60*60*24*365);
            header('Location: loading.html');
            exit;
        }
    }
if (count($errors)) {
    echo '<p>Ошибка отправки формы:</p>';
    foreach ($errors as $field => $error) {
        if ($field == 'counter') {
            echo $error.'<br/>';
        } else {
            echo 'Поле '.$field.': '.$error.'<br/>';
        }        
    }
}
?>
Почему-то у меня на 102строке появляется ошибка "Syntax error, unexpected $EOF" и страница перенаправляет на пустой файл send.php. Файл loading.html у меня действительно находится в корне сайта. У меня там всего 5 страниц. И я решила не заморачиваться с папкой под них
0
Невнимательный
 Аватар для ft4l
3114 / 1294 / 359
Регистрация: 08.02.2013
Сообщений: 7,573
Записей в блоге: 2
04.02.2020, 23:50
Лучший ответ Сообщение было отмечено Steisi1982 как решение

Решение

я бы наверное как-то так раскидал, если нигде не ошибся ... не проверял
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?php
$errors = [];
if (isset($_POST['email']) {
 
    $allowed_ext = ['gif', 'png', 'jpg', 'jpeg']; //  pdf ?? ... bmp
    if (isset($_COOKIE['count']) && $_COOKIE['count'] > 1)
        $errors[0] =  "На конкурс можно отправить только две работы";
    else foreach (['email','name','workname','tel','age','sity'] as $key) {
        if (!isset($_POST[$key]) || ($$key = trim($_POST[$key])) == '') {
            $errors[$key] = 'Не заполнено поле '.$key;
            continue;
        }
        switch($key) {
        case 'email': 
            if (!$email = filter_var($email, FILTER_SANITIZE_EMAIL))
                $errors[$key] = 'Неправильно указан email';
        break;
        case 'age': 
            if (($age=(int)$age) > 18 || $age <5)
                $errors[$key] = 'Простите вы не подходите по возрасту';
        break;
        default:
            $$key = htmlentities($$key, ENT_QUOTES, 'utf-8');
        }
    }
    // разрешенные расширения файлов
    $fname = pathinfo($_FILES["file"]["name"]);
    $ext = strtolower($fname['extension']);
    $fname = $fname['filename'];
    if (!in_array($ext, $allowed_ext) || strpos($_FILES["file"]["type"], 'image/') !== 0)
        $errors['file'] = $pi['basename'].' Можно загружать файлы только в формате '. implode(', ', $allowed_ext);
 
    if (count($errors))  {
        echo '<p>Неправильно заполнена форма:</p>';
        foreach ($errors as $field => $error) {
            echo 'Поле '.$field.': '.$error.'<br/>';
        }
    }
    else {
        if ($age < 7) {
            $mailto = "pomnipobedu5-6@yandex.ru";
        } elseif ($age <10) {
            $mailto = "pomnipobedu7-9@yandex.ru";
        } elseif ($age <13) {
            $mailto = foreach"pomnipobedu10-12@yandex.ru";
        } elseif ($age <15) {
            $mailto = "pomnipobedu13-14@yandex.ru";
        } else {
            $mailto = "pomnipobedu15-18@yandex.ru";
        }
        
        $from_mail = "mail1@mail.ru";
        $replyto = "mail2@mail.ru";
        $from_name = "My site service";
        $subject = 'Сообщение с сервиса';
        $subject= '=?utf-8?B?' . base64_encode($subject) . '?=';
        $message = "Фамилия:".$surname.".<br/>
            Имя: ".$name. ".<br/>
            Название работы: ".$workname. ".<br/>
            Телефон: ".$tel. ".<br/>
            E-mail: ".$email. ".<br/>
            Возраст: ".$age. ".<br/>
            Населенный пункт: ".$sity."<br/>";
        $filename = 'image'.uniqid().'.'.$ext;
        $content = chunk_split(base64_encode(file_get_contents($_FILES["file"]["tmp_name"])));
        $uid = md5(uniqid(time()));
        $header = "From: " . $from_name . " <" . $from_mail . ">\r\n";
        $header .= "Reply-To: " . $replyto . "\r\n";
        $header .= "MIME-Version: 1.0\r\n";    
        $header .= "Content-Type: multipart/mixed; boundary=\"" . $uid . "\"\r\n\r\n";
        $body = "This is a multi-part message in MIME format.\r\n";
        $body .= "--" . $uid . "\r\n";
        $body .= "Content-type:text/html; charset=utf-8\n";
        $body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
        $body .= "<div>" . $message . "</div>\r\n\r\n";
 
        $body .= "--" . $uid . "\r\n";
        $body .= "Content-Type: application/octet-stream; name=\"" . $filename . "\"\r\n"; // use different content types here
        $body .= "Content-Transfer-Encoding: base64\r\n";
        $body .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\r\n\r\n"; // For Attachment
        $body .= $content . "\r\n\r\n";
        $body .= "--" . $uid . "--";
        if (mail($mailto, $subject, $body, $header)) {
            $count = (isset($_COOKIE['count']))? 2:1;
            setcookie("count", $count, time() + 60*60*24*365, true);
            header('Location: loading.html');
        } else {
            echo "<p>Письмо не удалось отправить</p><pre>";
            print_r(error_get_last());
            echo '</pre>';
        }
    }// ! count($errors)
} // 'POST'
?>
Но если подумать... может детишки пользуются одним браузером на весь класс
или постарше школьники тестируют curl )) и без включённых куки могут закидать письмами ) в спам-лист могут записать
Нет проверки на то что файл загружен // при превышении размера например размер будет 0 и ошибка 1

Добавлено через 21 минуту
отрывок из прошлой темы )
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
 
    if($_FILES["file"]['error']) {
         $arr = [
            1 => 'Размер принятого файла превысил upload_max_filesize',
            2 => 'Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме',
            3 => 'Загружаемый файл был получен только частично',
            4 => 'Файл не был загружен',
            6 => 'Отсутствует временная папка',
            7 => 'Не удалось записать файл на диск',
            8 => 'PHP-расширение остановило загрузку файла'
        ];
        $errors[]= isset( $arr[$_FILES["file"]['error']]) ? $arr[$_FILES["file"]['error']]: 'Unknown error';
    }
Добавлено через 8 минут
Цитата Сообщение от x_lab Посмотреть сообщение
header('Location: loading.html');
PHP
1
            header('Location: /loading.html');
Цитата Сообщение от x_lab Посмотреть сообщение
if (isset($_COOKIE['count']) && $_COOKIE['count'] > 1)
PHP
1
    if (isset($_COOKIE['count']) && intval($_COOKIE['count']) > 1)
Добавлено через 7 минут
Цитата Сообщение от Steisi1982 Посмотреть сообщение
"Syntax error, unexpected $EOF"
чаще всего не сочетаются фигурные скобки
Цитата Сообщение от Steisi1982 Посмотреть сообщение
пустой файл send.php
пустой ответ ещё будет всегда когда не установлено это $_POST[email]
например если данные превышают post_max_size
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
05.02.2020, 15:50
Steisi1982, а если все файлы у Вас html, один только этот php, то как передать информацию об отправке формы в loading.html? можно показать весь его код?
1
1 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 62
05.02.2020, 23:10  [ТС]
Я не передаю информацию об отправке формы в loading.php. Просто эта страница открывается только после успешного заполнения формы. И на этой странице текст о том, что заявка успешно принята. Все
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
06.02.2020, 16:13
неправильно вопрос сформулировал. имел в виду следующее - как передать в файл с формой, которой отправляем данные, сообщения об ошибках. если мы их выведем в файле send.php, то может сбиться оформление в файле формы. короче, как в нужное место файла с формой передать сообщение, например, о том,что пользователь может отправить не более 2 пакетов данных с этой формы. код файла формы для этого хотелось бы узнать
1
1 / 0 / 0
Регистрация: 16.05.2018
Сообщений: 62
07.02.2020, 02:24  [ТС]
"Но если подумать... может детишки пользуются одним браузером на весь класс ". Что-то нам эта мысль в голову не приходила. Решили обойтись без куки
0
Невнимательный
 Аватар для ft4l
3114 / 1294 / 359
Регистрация: 08.02.2013
Сообщений: 7,573
Записей в блоге: 2
07.02.2020, 04:42
Цитата Сообщение от Steisi1982 Посмотреть сообщение
без куки
Я-бы не стал столь категорично обрубать все куки ))

Не силён в javascript... но вроде должна быть возможность установить куку непосредственно перед отправкой формы
и при получении данных проверить записанное туда время например или ещё какое значение.
Как бы тоже хоть какая-то вероятность защиты от отправки минуя формы
но требует включённого js и куки, и сообщения о том что есть такие требования.

Но если средствами сервера, скорее всего никак не обойтись без хранения данных на сервере... файлы/db
Если, как моей точки зрения, должна быть максимальная доступность для нужного контингента,
или не знаю как это называется и максимальное противодействие ненужному.
... Хранение на сервере IP-адресов, например посылавших за последний небольшой промежуток времени, может существенно понизить риск бомбардировок )) всякими ботами, скажем 2-3 минуты.
Так-же защитит от случайных многократных отправок формы...
как это бывает, сообщение, мол вы отправили сообщение менее трёх тому минут

Всякие проверки типа "ведите текст с картинки", "введите три раза ответ на вопрос: три плюс два "
тоже требуют временного хранения данных, и возможно динамической генерации формы...

Вообще можно хранить ещё много разных данных, больше данных - больше возможностей...
например ограничение по email+имя или имя+организация-email...
Но больше данных, серьёзней риск утечки...
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
07.02.2020, 14:25
тут еще такой вопрос у меня возник по функциональности или логике. короче, вот пользователь заполняет форму в первый раз. оно вводит свои данные тел, емайл, семейное положение ну и т.д. в завершение всего вводит какую-то картинку и отправляет все эти данные в первый раз. во второй раз он снова повторно вводит те же данные, и только картинку вводит другую. может, лучше заполнить форму и отправляет ее один раз,но загрузить не один, а два файла.
проблему с куками или точнее с идентификацией пользователя можно решить таким образом: так как в форме есть поле emaiil, можно сохранять этот email и телефон в базе данных, а потом проверять введенные данные у других пользователей - если будут такие, то выводить сообщение, что финит аля комедия.
тут возникает очередная проблема - могут вводить email и телефон выдуманные. для борьбы с такой диверсией придется сделать так: после отправки формы пользователем выводить ему сообщение: "на ваш email отправлено сообщение с нашего сайта. в нем вы должны перейти по указанной там ссылке, чтобы подтвердить, что вы легальный участник нашей программы, а не спамер. благодарим за понимание" после перехода по ссылке в базу данных заносится в зашифрованном виде email и телефон пользователя, после чего данные пользователя отправляются с этого сайта. после проверять наличие этих емайлов в базе
а для борьбы со спамом - какую-нибудь ре-капчу ну и т.д
вот как то так предлагаю

Добавлено через 36 минут
Цитата Сообщение от x_lab Посмотреть сообщение
должна быть возможность установить куку непосредственно перед отправкой формы
основная проблема в том, что это куку можно за полминуты убрать в любой момент, именно эту, не удаляя другие, используя только браузер. поэтому куки - это для честных и ответственных посетителей. а другие - оправил форму, зашел в браузер, удалил куку - и другую форму заполняет.
Цитата Сообщение от x_lab Посмотреть сообщение
тоже требуют временного хранения данных
их надо хранить в сессии, по-моему никаких проблем с этим
Цитата Сообщение от x_lab Посмотреть сообщение
динамической генерации формы
круто, не является проблемой - javascript отлично это делает
Цитата Сообщение от x_lab Посмотреть сообщение
Но больше данных, серьёзней риск утечки
это точно, но незачем хранить много - можно хранить только email в зашифрованном виде. можно намудрить в том плане, что хранить только аккаунты абонентов почтовых сервисов - то что до знака @ и в зашифрованном виде. то, что справа
хранить отдельно в зашифрованном виде с другим шифром. потом новый емайл преобразовывать в нужный формат и искать наличие таких элементов в базе. а что делать? риск всегда есть
0
Невнимательный
 Аватар для ft4l
3114 / 1294 / 359
Регистрация: 08.02.2013
Сообщений: 7,573
Записей в блоге: 2
07.02.2020, 16:49
vinikon, насколько я понял, на данный момент ТС использует только html-фвйлы, не считая этого замысловатого скрипта
И пока не решается, перейти-ли на php окончательно )) а использованию cms уже решительное нет.

Т.e. генерация картинки, старт сессии, получение контрольных вопросов из бд... пока не предвидится )
По крайней мере пока другие файлы не станут php-файлами.
Поэтому в первую очередь предположил что как минимум , не помешает работа с файлом типа
123.123.345.345 1581081150
123.123.76.8 1581081137
123.123.4.2 1581081135
123.123.2.2 1581081133

$_SERVER['REMOTE_ADDR'] .' '. time()

Плюс возможно что-то не хитрое между JS и PHP
Хотя разобравшись в коде злоумышленики без труда смогут добавлять нужные куки,
но какая-то их часть поленится )) и на крайний случай хотя-бы не отправки будут не чаще нескольких минут
, с каждого ip им подконтрольного

Добавлено через 10 минут
Более изощрённые способы уже наверное удобнее с заведением полноценных пользователей.
А пока так, адрес валидный , поля заполнены, пусть шлют письма , но не слишком )

Хотя да , соглашусь, при большом наплыве , будет не удобно доставать всё из писем, когда можно было-бы смотреть с сайта, любую информацию, любым удобным способом

Добавлено через 14 минут
Далее по ходу использования возможно будет иметь смысл бан по наличию ссылок в тексте, и чёрные списки ip )
0
 Аватар для vinikon
340 / 160 / 89
Регистрация: 16.01.2020
Сообщений: 771
07.02.2020, 17:19
Цитата Сообщение от x_lab Посмотреть сообщение
возможно что-то не хитрое между JS и PHP
по-моему форма отправки данных с картинками завязана на скрытый фрейм, туда данные с этого php скрипта можно только через js передать. в самом файле формы саму форму (что-то я заговариваться начинаю) можно сгенерить на js, прилепить ре-каптчу от ботов. сами файлы неплохо бы упрятать в закрытую директорию и заход через index.php
Цитата Сообщение от x_lab Посмотреть сообщение
удобнее с заведением полноценных пользователей
создавать регистрацию для отправки одного-двух писем вряд ли целесообразно, причем, можно, наверно и одним письмом обойтись с двумя картинками. главное потом этого пользователя определить
Цитата Сообщение от x_lab Посмотреть сообщение
Поэтому в первую очередь предположил что как минимум , не помешает работа с файлом типа
для него тоже php нужен. поэтому что для баз данных, что для файла - php обработчик все равно нужен.

я вот здесь Методы идентификации пользователя в интернете нашел вот что
Evercookie — Samy Mamkar разработал систему, которая позволяет хранить куки в 8 местах, автоматически восстанавливая друг друга, и даже добиться того, чтобы куки, поставленное в одном браузере, действовало и в другом. Удалить это куки практически невозможно! (Все возможно, конечно, но слишком много мороки)
Куки хранятся в:

HTTP Cookies;
Local Shared Objects (Flash);
Сохранение куки в значениях RGB автосгенерированных и форсированно кэшированных PNG с использованием HTML5 canvas;
Сохранение куки в Web History;
HTML5 Session Storage;
HTML5 Local Storage;
HTML5 Global Storage;
HTML5 Database Storage через SQLite.
При удалении из одного из этих мест кука автоматически восстанавливается из оставшихся. Работает даже если пользователь сменит браузер (через Local Shared Objects из Flash).
надо будет с этим как-то в перспективе разобраться
0
Невнимательный
 Аватар для ft4l
3114 / 1294 / 359
Регистрация: 08.02.2013
Сообщений: 7,573
Записей в блоге: 2
07.02.2020, 18:37
Цитата Сообщение от vinikon Посмотреть сообщение
скрытый фрейм
Не, вроде наоборот... можно передать даже без js, не обновляя саму страницу ....насколько понял.
Кстати с iframe тоже вариант, в смысле встроить в форму, и сервер сможет как-то реагировать... на то что страница загружена
Но это наверное нужен ещё один php-файл )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2020, 18:37
Помогаю со студенческими работами здесь

проблема с куками
первый файл &lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;...

Авторизация с куками
Пишу вот это : setcookie('login',$login,time() + 3600*24);После проверки на верность введенного адреса и пароля с БД. выдает ошибку не могу...

Задача с Куками.
Доброго времени суток. Помогите пожалуйста с задачей. Не представляю даже с чего начать. Задача: при первом посещении пользователь вводит...

Что-то не так с куками
SetCookie(&quot;authorization&quot;,&quot;OK&quot;); Срабатывает только 1 раз, далее даже если не ок, иф всеравно срабатывает. ...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru