Advertisement
  1. Code
  2. PHP
  3. PHP Scripts

Создайте свою собственную Captcha и контактную форму

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

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

Шаг 1: captcha.php и сессии

Сначала нам нужно создать новую страницу PHP и сохранить ее как captcha.php. Затем в новом скрипте откройте сессию сервера, используя команду session_start(). Кроме того, создайте пустую переменную с именем «string». Мы будем использовать эту переменную позже для хранения нашего случайно генерируемого текста.

1
2
<?php
3
4
session_start();
5
6
$string = '';
7
8
?>

Шаг 2: Случайная строка

Далее нам нужно написать цикл for, который будет генерировать случайную строку. Затем мы возьмем эту случайную строку и установим ее в переменной сессии, называемой «random_code».

1
2
<?php
3
4
session_start();
5
6
$string = '';
7
8
for ($i = 0; $i < 5; $i++) {
9
  $string .= chr(rand(97, 122));
10
}
11
12
$_SESSION['random_code'] = $string;

Этот цикл for, как вы заметите, добавляет строчный символ ascii, используя функцию chr(), в нашу переменную $string на каждом проходе. Мой пример генерирует 5 символов, но вы можете отрегулировать это число, изменив $i.

Шаг 3: Папка хранения и Цвета

Здесь учебник становится немного сложнее. Дальше нам нужно определить папку для хранения шрифта, который мы собираемся использовать, построить базовое изображение captcha и определить цвета, которые мы будем использовать для заполнения нашего изображения. Все это простой код, но эти функции разработчики не часто используют.

1
2
$dir = 'fonts/';
3
4
$image = imagecreatetruecolor(170, 60);
5
$black = imagecolorallocate($image, 0, 0, 0);
6
$color = imagecolorallocate($image, 200, 100, 90); // red

7
$white = imagecolorallocate($image, 255, 255, 255);

Первоначально я просто определяю в переменной $dir папку, где мои шрифты хранятся. Переменная $image, где мы используем функцию imagecreatetruecolor(), является изображением. Здесь базовое изображение captcha создается с использованием PHP. Функция imagecreatetruecolor() возвращает идентификатор изображения, представляющий черное изображение указанного размера. Как вы можете видеть, мое изображение имеет ширину 170px и высоту 60px.

Наконец, на этом этапе я определяю некоторые цвета, которые мы можем использовать в нашем окончательном изображении. Номера, переданные функции imagecolorallocate(), являются значениями RGB.

Шаг 4: Создание изображения

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

1
2
imagefilledrectangle($image,0,0,200,100,$white);
3
imagettftext($image, 30, 0, 10, 40, $alt, $dir."arial.ttf", $_SESSION['rand_code']);

Функция imagefilledrectangle() рисует прямоугольник на указанном изображении. Четыре числа, переданные в функцию, представляют собой координаты для углов прямоугольника. Убедитесь, что прямоугольник, который вы рисуете здесь, больше, чем базовое изображение. Вы заметите, что мой прямоугольник имеет ширину 200 пикселей и высоту 100 пикселей.

Функция imagettftext() позволяет добавлять текст к изображению с использованием шрифтов True Type. И вы увидите, что эта функция может обрабатывать довольно много параметров. Я хотел бы выделить все различные параметры этой функции, но вам нужно запомнить несколько.

1
2
imagettftext($image, $font_size, $angle, $x, $y, $color ,$font_file ,$text);

Как только вы сравните мой пример с кодом, приведенным выше, вы увидите, что значения, переданные функции imagettftext(), легко понять. Первое - это изображение, затем размер шрифта, угол текста, координаты текста x и y (начиная с верхнего левого угла), цвет текста, расположение файла шрифта и, наконец, текст (наша случайная строка).

Шаг 5: Окончательное изображение

Далее, в нашем скрипте, нам нужно функцией header() сообщить браузеру, какой тип изображения мы используем, и построить окончательное изображение. Эти функции настолько прямолинейны, что про них мало что можно объяснить. Кроме того, не забудьте закрыть свой PHP-скрипт.

1
2
header("Content-type: image/png");
3
imagepng($image);
4
5
?>

После просмотра в браузере сценарий должен сгенерировать png-изображение, содержащее некоторый текст. Если вы получаете ошибки, убедитесь, что ваш скрипт может ссылаться на ваш файл шрифта .ttf и что вы создали пустую переменную $string, см. ранее в учебнике.

Вот как должен выглядеть окончательный код для вашей страницы captcha.php:

1
2
<?php
3
session_start();
4
5
$string = '';
6
7
for ($i = 0; $i < 5; $i++) {
8
	// this numbers refer to numbers of the ascii table (lower case)

9
	$string .= chr(rand(97, 122));
10
}
11
12
$_SESSION['rand_code'] = $string;
13
14
$dir = 'fonts/';
15
16
$image = imagecreatetruecolor(170, 60);
17
$black = imagecolorallocate($image, 0, 0, 0);
18
$color = imagecolorallocate($image, 200, 100, 90); // red

19
$white = imagecolorallocate($image, 255, 255, 255);
20
21
imagefilledrectangle($image,0,0,399,99,$white);
22
imagettftext ($image, 30, 0, 10, 40, $color, $dir."arial.ttf", $_SESSION['random_code']);
23
24
header("Content-type: image/png");
25
imagepng($image);
26
?>

Шаг 6: contact.php

Создайте новую страницу контактов на PHP и сохраните ее как contact.php. Эта страница будет содержать нашу контактную форму, которая будет проверяться с использованием нашего кода.

Шаг 7: HTML & CSS

Давайте добавим HTML-форму на нашу страницу contact.php. Обратите особое внимание на источник изображения, который мы используем для случайного текста.

1
2
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
3
	<p><input type="text" name="name" /></p>
4
	<p><input type="text" name="email" /></p>
5
	<p><textarea name="message"></textarea></p>
6
	<img src="captcha.php"/>
7
	<p><input type="text" name="code" /></p>
8
	<p><input type="reset" name="submit" value="Send" /></p>
9
</form>

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

1
2
<style type="text/css">
3
form {
4
	margin:0;
5
	padding:0;
6
}
7
input {
8
	padding:2px;
9
	width:200px;
10
}
11
textarea {
12
	padding:2px;
13
	width:200px;
14
	height:100px;
15
}
16
.button {
17
	width:60px;
18
}
19
p {
20
	margin:0 0 5px 0;
21
	padding:0;
22
}
23
.error {
24
	color:#FF0000;
25
	margin:0 0 10px 0;
26
}
27
.accept {
28
	color:#339966;
29
	margin:0 0 10px 0;
30
}
31
</style>

Шаг 8: Валидация с помощью PHP

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

Ниже приведена окончательная валидация PHP. Два важных шага, необходимых для этого процесса проверки: session_start(); и if($_POST['code'] == $_SESSION['rand_code']). Эти элементы позволяют нам получить доступ к переменной сессии и проверить ее на текст, который кто-то пишет в поле кода нашей формы. Без них наша captcha была бы бесполезна.

1
2
<?php
3
session_start();
4
5
if(isset($_POST['submit'])) {
6
	
7
	if(!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message']) && !empty($_POST['code'])) {
8
	
9
		if($_POST['code'] == $_SESSION['rand_code']) {
10
		
11
			// send email

12
			$accept = "Thank you for contacting me.";
13
		
14
		} else {
15
		
16
			$error = "Please verify that you typed in the correct code.";
17
		
18
		}
19
		
20
	} else {
21
	
22
		$error = "Please fill out the entire form.";
23
	
24
	}
25
26
}
27
?>

Если вы много знаете о PHP, остальная часть этой проверки должна быть легко понята. Мы должны удостовериться, что ни одно из полей формы не было пустым. Если они пустые, показываем ошибки, чтобы убедиться, что наш пользователь вводит информацию. Вы также заметите, что я не проверяю, корректная ли введена электронная почта, но вам следует это сделать. Проверка подлинности электронной почты выполняется с использованием регулярных выражений.

Вот как должен выглядеть ваш окончательный файл contact.php. Я включаю CSS, который вы можете захотеть удалить в своем собственном файле CSS.

1
2
<?php
3
4
session_start();
5
6
if(isset($_POST['submit'])) {
7
	
8
	if(!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['message']) && !empty($_POST['code'])) {
9
	
10
		if($_POST['code'] == $_SESSION['rand_code']) {
11
		
12
			// send email

13
			$accept = "Thank you for contacting me.";
14
		
15
		} else {
16
		
17
			$error = "Please verify that you typed in the correct code.";
18
		
19
		}
20
		
21
	} else {
22
	
23
		$error = "Please fill out the entire form.";
24
	
25
	}
26
27
}
28
29
?>
30
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
31
<html xmlns="http://www.w3.org/1999/xhtml">
32
<head>
33
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
34
<title>Contact Us</title>
35
<style type="text/css">
36
form {
37
	margin:0;
38
	padding:0;
39
}
40
input {
41
	padding:2px;
42
	width:200px;
43
}
44
textarea {
45
	padding:2px;
46
	width:200px;
47
	height:100px;
48
}
49
.button {
50
	width:60px;
51
}
52
p {
53
	margin:0 0 5px 0;
54
	padding:0;
55
}
56
.error {
57
	color:#FF0000;
58
	margin:0 0 10px 0;
59
}
60
.accept {
61
	color:#339966;
62
	margin:0 0 10px 0;
63
}
64
</style>
65
</head>
66
67
<body>
68
69
<?php if(!empty($error)) echo '<div class="error">'.$error.'</div>'; ?>
70
<?php if(!empty($accept)) echo '<div class="accept">'.$accept.'</div>'; ?>
71
72
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
73
	<p><input type="text" name="name" /> Name</p>
74
	<p><input type="text" name="email" /> Email</p>
75
	<p><textarea name="message"></textarea></p>
76
	<img src="captcha.php"/>
77
	<p><input type="text" name="code" /> Are you human?</p>
78
   <p><input type="submit" name="submit" value="Send" class="button" /></p>
79
</form>
80
81
</body>
82
</html>

Вы все сделали

Когда валидация будет реализована, ваша контактная форма с captcha должна работать отлично. Вы согласны? Спасибо за прочтение.

  • Следуйте за нами в Твиттере или подпишитесь на RSS-канал NETTUTS для получения ежедневных веб-разработок и статей.


Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.