Помогите разабраться со скриптом "Капчи"

Статус
В этой теме нельзя размещать новые ответы.

troll90945

Читатель
Заблокирован
Регистрация
29 Фев 2008
Сообщения
109
Реакции
47
  • Автор темы
  • Заблокирован
  • #1
Скачал скрипт капчи для форм. всё хорошо работает.
Код:
<?php
/** SETTINGS - you can easily modify these constants **/
DEFINE('COLOR', "Красный");
DEFINE('SIZE', 5);
DEFINE('LINEHEIGHT', 4);
DEFINE('QUESTION', "Для продолжение решите уравнение:");
/** SETTINGS - you can easily modify these constants **/

class MathGuard {

	/** you can also modify $output to your needs **/
	function produceOutput($prime) {
		$a = rand() % 10; // generates the random number
		$b = rand() % 10; // generates the random number
		$code = MathGuard :: generateCode($a, $b, $prime);
		
		// please don't remove the backlink, thank you
		$output = "<a href='WWW.Parini.ru/'></a> " . QUESTION .
		"<table border='0'><tr><td></td></tr><tr><td><pre style='font-size:" . SIZE . "px; font-weight: bold; color: " . COLOR . "; padding:0px; margin: 0px; line-height:" . LINEHEIGHT . "px;'>\n\n" . MathGuard :: renderExpression($a, $b) . "</pre></td>
				<td><input type='input' name='mathguard_answer' size='2' maxlength='2'/><input type='hidden' name='mathguard_code' value='$code' /></td>
				</tr>
				</table>
				";

		return $output;
	}

	/** function that converts the decimal number to line of 3 random characters 
	 * @param $dec		decimal number that is being converted to line of 3 random characters
	 * */
	function decToBin($dec) {
		$pattern = "123456789ABCDEFGHIJKLMNOPQRTSTUWXYZ"; //without zero, it was interpreted as an empty space
		$output = "   ";
		$i = 0;
		do {
			if ($dec % 2) {
				$rand = rand() % 34;
				$output {
					2 - $i }
				= $pattern {
					$rand };
			} else {
				$output {
					2 - $i }
				= " ";
			}
			$dec = (int) ($dec / 2);
			$i++;
		} while ($dec > 0);
		return $output;
	}

	/** function that renders a final 3x5 matrix consisting of random characters 
	 * @param $a		random number a that renders to the 3x5 matrix consisting of random characters 
	 * @param $b		random number b that renders to the 3x5 matrix consisting of random characters 
	 * */
	function renderExpression($a, $b) {

		$number = array (
			array (
				7,
				5,
				5,
				5,
				7
			),
			array (
				2,
				6,
				2,
				2,
				7
			),
			array (
				7,
				1,
				7,
				4,
				7
			),
			array (
				7,
				1,
				7,
				1,
				7
			),
			array (
				4,
				5,
				7,
				1,
				1
			),
			array (
				7,
				4,
				7,
				1,
				7
			),
			array (
				7,
				4,
				7,
				5,
				7
			),
			array (
				7,
				1,
				1,
				1,
				1
			),
			array (
				7,
				5,
				7,
				5,
				7
			),
			array (
				7,
				5,
				7,
				1,
				7
			)
		);

		$plus = array (
			0,
			2,
			7,
			2,
			0
		);
		$eq = array (
			0,
			7,
			0,
			7,
			0
		);

		for ($line = 0; $line < 5; $line++) {

			$output .= MathGuard :: decToBin($number[$a][$line]) . "   " . MathGuard :: decToBin($plus[$line]) . "   " . MathGuard :: decToBin($number[$b][$line]) . "   " . MathGuard :: decToBin($eq[$line]) . "\n";

			$output = str_replace("0", " ", $output);

		}

		return $output;
	}

	/** A main hashing function: concat of user's answer, hour and the additional prime number (default 37) */
	function encode($input, $prime) {
		return md5($input . date("H") . $prime);
	}

	/** This function generates the hash code from the two numbers 
	 * @param $a 	first number
	 * @param $b	second sumber
	 * @param $prime	additional number to encode with
	 * */
	function generateCode($a, $b, $prime) {
		$code = MathGuard :: encode($a + $b, $prime);
		return $code;
	}

	/** This function checks whether the answer and generated security code match 
	 * @param $mathguard_answer		answer the user has entered
	 * @param $mathguard_code		hashcode the mathguard has generated
	 */
	function checkResult($mathguard_answer, $mathguard_code, $prime = 37) {

		//		echo("prime; $prime, $mathguard_answer");
		$result_encoded = MathGuard :: encode($mathguard_answer, $prime);

		if ($result_encoded == $mathguard_code)
			return true;
		else
			return false;

	}

	/** this function inserts the two math term into your form, the parameter is optional */
	function insertQuestion($prime = 37) { //default prime is 37, you can change it when specifying the different parameter

		$output = MathGuard :: produceOutput($prime);

		echo $output;

	}

	/** this function returns math expression into your form, the parameter is optional 
	 * quite simmilar to insertQuestion, but returns the output as a text instead of echoing
	 */
	function returnQuestion($prime = 37) { //default prime is 37, you can change it when specifying the different parameter

		$output = MathGuard :: produceOutput($prime);

		return $output;

	}

}
?>
Все что надо сделать что бы форма работала это вставить этот код в форму
Код:
<?php require("ClassMathGuard.php"); MathGuard::insertQuestion(); ?> 
	<br/><br/>
И здесь есть небольшой нюанс который я не могу понять.
для того что бы форма могла обратится к скрипту не находяшегося в дериктории с формой.
то для этого надо дописать полный путь. начиная от домена.
допустим скрипт лежит по адресу Для просмотра ссылки Войди или Зарегистрируйся
то тогда код должен выклядить так
<?php require("http://WWW.mysaite.ru/antispam/ClassMathGuard.php"); MathGuard::insertQuestion(); ?>
<br/><br/>
однако данный код выдаёт ошибку.
Warning: require(C:\Program Files\VertrigoServ\www \ClassMathGuard.php) [function.require]: failed to open stream: Invalid argument in C:\Program Files\VertrigoServ\www\t\index.php on line 19

Fatal error: require() [function.require]: Failed opening required 'C:\Program Files\VertrigoServ\www \ClassMathGuard.php' (include_path='.;C:\Program Files\VertrigoServ\Smarty') in C:\Program Files\VertrigoServ\www\t\index.php on line 19
по не понятным для меня причинам. Поскажите в чём тут дело???
 
попробуй подгрузить файл таким путем ../.../ClassMathGuard.php

только это приммер написал!
 
полный путь -- путь от корня файловой системы

например : /home/site/www/dirictory/file.ext
то что ты привел -- полный урл ,это другое

или используй относительную адресацию :
. - текущая директория
.. - на уровень выше
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху