PHP Text Captcha 是由免费的验证码脚本生成的文本图像。它用于保护您的登录表单、注册表单或任何表单免受垃圾邮件、滥用和黑客攻击。
在本文中,我们将学习如何在没有 google captcha API 的情况下创建 PHP Text Captacha。PHP Text Captcha 是用于创建复杂图像的开源脚本。
PHP文本验证码的特点:
- 代码结构很小。
- phpTextClass 用于创建验证码图像
- 代码是完全可定制的
- 带有随机线条和噪音的安全功能
- 防止垃圾邮件发送者和滥用脚本。
- 消除从随机黑客脚本中破解信息的可能性。
phpcaptchaClass.php
在这个文件中,我们创建了一个 phpcaptcha 类、hexTo RGB 和 ImageTTFCenter 函数来创建文本验证码的 imgae。
<?php
/* phpcaptcha class, version 1.0
created by www.tutorialswebsite.com (Pradeep Maurya)
october 5, 2017
*/
class phpcaptchaClass {
public function phptext($text, $textColor, $backgroundColor = '', $fontSize, $imgWidth, $imgHeight, $dir, $fileName) {
/* settings */
$font = realpath(".") . '/monofont.ttf'; /* define font */
$textColor = $this->hexToRGB($textColor);
$im = imagecreatetruecolor($imgWidth, $imgHeight);
$textColor = imagecolorallocate($im, $textColor['r'], $textColor['g'], $textColor['b']);
if ($backgroundColor == '') {/* select random color */
$colorCode = array('#56aad8', '#61c4a8', '#d3ab92');
$backgroundColor = $this->hexToRGB($colorCode[rand(0, count($colorCode) - 1)]);
$backgroundColor = imagecolorallocate($im, $backgroundColor['r'], $backgroundColor['g'], $backgroundColor['b']);
} else {/* select background color as provided */
$backgroundColor = $this->hexToRGB($backgroundColor);
$backgroundColor = imagecolorallocate($im, $backgroundColor['r'], $backgroundColor['g'], $backgroundColor['b']);
}
imagefill($im, 0, 0, $backgroundColor);
list($x, $y) = $this->ImageTTFCenter($im, $text, $font, $fontSize);
imagettftext($im, $fontSize, 0, $x, $y, $textColor, $font, $text);
if (imagejpeg($im, $dir . $fileName, 90)) {/* save image as JPG */
return json_encode(array('status' => TRUE, 'image' => $dir . $fileName));
imagedestroy($im);
}
}
public function phpcaptcha($textColor, $backgroundColor, $imgWidth, $imgHeight, $noiceLines = 0, $noiceDots = 0, $noiceColor = '#162453') {
/* Settings */
$text = $this->random();
$font = realpath(".") . '/monofont.ttf'; /* define font */
$textColor = $this->hexToRGB($textColor);
$fontSize = $imgHeight * 0.75;
$im = imagecreatetruecolor($imgWidth, $imgHeight);
$textColor = imagecolorallocate($im, $textColor['r'], $textColor['g'], $textColor['b']);
$backgroundColor = $this->hexToRGB($backgroundColor);
$backgroundColor = imagecolorallocate($im, $backgroundColor['r'], $backgroundColor['g'], $backgroundColor['b']);
/* generating lines randomly in background of image */
if ($noiceLines > 0) {
$noiceColor = $this->hexToRGB($noiceColor);
$noiceColor = imagecolorallocate($im, $noiceColor['r'], $noiceColor['g'], $noiceColor['b']);
for ($i = 0; $i < $noiceLines; $i++) {
imageline($im, mt_rand(0, $imgWidth), mt_rand(0, $imgHeight),
mt_rand(0, $imgWidth), mt_rand(0, $imgHeight), $noiceColor);
}
}
if ($noiceDots > 0) {/* generating the dots randomly in background */
for ($i = 0; $i < $noiceDots; $i++) {
imagefilledellipse($im, mt_rand(0, $imgWidth),
mt_rand(0, $imgHeight), 3, 3, $textColor);
}
}
imagefill($im, 0, 0, $backgroundColor);
list($x, $y) = $this->ImageTTFCenter($im, $text, $font, $fontSize);
imagettftext($im, $fontSize, 0, $x, $y, $textColor, $font, $text);
imagejpeg($im, NULL, 90); /* Showing image */
header('Content-Type: image/jpeg'); /* defining the image type to be shown in browser widow */
imagedestroy($im); /* Destroying image instance */
if (isset($_SESSION)) {
$_SESSION['captcha_code'] = $text; /* set random text in session for captcha validation */
}
}
/* for random string */
protected function random($characters = 6, $letters = '23456789bcdfghjkmnpqrstvwxyz') {
$str = '';
for ($i = 0; $i < $characters; $i++) {
$str .= substr($letters, mt_rand(0, strlen($letters) - 1), 1);
}
return $str;
}
/* function to convert hex value to rgb array */
protected function hexToRGB($colour) {
if ($colour[0] == '#') {
$colour = substr($colour, 1);
}
if (strlen($colour) == 6) {
list( $r, $g, $b ) = array($colour[0] . $colour[1], $colour[2] . $colour[3], $colour[4] . $colour[5]);
} elseif (strlen($colour) == 3) {
list( $r, $g, $b ) = array($colour[0] . $colour[0], $colour[1] . $colour[1], $colour[2] . $colour[2]);
} else {
return false;
}
$r = hexdec($r);
$g = hexdec($g);
$b = hexdec($b);
return array('r' => $r, 'g' => $g, 'b' => $b);
}
/* function to get center position on image */
protected function ImageTTFCenter($image, $text, $font, $size, $angle = 8) {
$xi = imagesx($image);
$yi = imagesy($image);
$box = imagettfbbox($size, $angle, $font, $text);
$xr = abs(max($box[2], $box[4]));
$yr = abs(max($box[5], $box[7]));
$x = intval(($xi - $xr) / 2);
$y = intval(($yi + $yr) / 2);
return array($x, $y);
}
}
?>
index.php
该文件用于创建表单数据并用于在提交表单后验证验证码图像。
<?php
session_start();
if (isset($_POST['Submit'])) {
// code for check server side validation
if (empty($_SESSION['captcha_code']) || strcasecmp($_SESSION['captcha_code'], $_POST['captcha_code']) != 0) {
$msg = "<span style='color:red'>The Validation code does not match!</span>"; // Captcha verification is incorrect.
} else {// Captcha verification is Correct. Final Code Execute here!
$msg = "<span style='color:green'>The Validation code has been matched.</span>";
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>PHP Secure text Captcha.</title>
<link href="./css/style.css" rel="stylesheet">
<script type='text/javascript'>
function refreshCaptcha() {
var img = document.images['captchaimg'];
img.src = img.src.substring(0, img.src.lastIndexOf("?")) + "?rand=" + Math.random() * 1000;
}
</script>
</head>
<body>
<div id="frame0">
<center> <h1>PHP Secure Text Captcha Demo.</h1>
<p>More tutorials <a href="https://tutorialswebsite.com">www.tutorialswebsite.com</a></p></center>
</div>
<br>
<form action="" method="post" name="form1" id="form1" >
<table width="400" border="0" align="center" cellpadding="5" cellspacing="1" class="table">
<?php if (isset($msg)) { ?>
<tr>
<td colspan="2" align="center" valign="top"><?php echo $msg; ?></td>
</tr>
<?php } ?>
<tr>
<td align="right" valign="top"> Validation code:</td>
<td><img src="captcha.php?rand=<?php echo rand(); ?>" id='captchaimg'><br>
<label for='message'>Enter the code above here :</label>
<br>
<input id="captcha_code" name="captcha_code" type="text">
<br>
Can't read the image? click <a href='javascript: refreshCaptcha();'>here</a> to refresh.</td>
</tr>
<tr>
<td> </td>
<td><input name="Submit" type="submit" onclick="return validate();" value="Submit" class="button1"></td>
</tr>
</table>
</form>
</body>
</html>
captcha.php
该文件用于创建验证码图像。在这个文件中,我们包含“phpcaptchaClass.php”文件并创建一个phpcaptchaClass对象。
phpcaptcha():-此函数根据参数创建带有文本和线条或噪声的图像。
<?php
session_start();
include("./phpcaptchaClass.php");
/* create class object */
$phptextObj = new phpcaptchaClass();
/* phptext function to genrate image with text */
$phptextObj->phpcaptcha('#000', '#fff', 120, 40, 10, 25);
?>
结论
在示例脚本中,静态图像显示在 3D 图像库中。