Flex
(aka Felix Jacobi)
Nachdem in letzter Zeit der TextCaptcha ein wenig häufiger aufgekommen ist, habe ich mich mal dran gesetzt und einen einfachen Text Captcha geschrieben... Und versucht dabei mich ein wenig weiter in OOP zu üben.
Nun bin ich kein Profi darin und habe auch keinerlei fachliche Ausbildung in diesem Bereich, deshalb bin ich nun offen für jedwede Verbesserung:
txtcaptcha.class.php
example.php
Das ganze gibts hier auch nochmal als Source zu begutachten:
http://dev.flexmex.net/temp/txtcaptcha.class.phps
http://dev.flexmex.net/temp/example.phps
Die Kommentare sind mir leider nicht so gut gelungen (sollen möglichst phpDoc valide sein), da nehme ich auch gerne Ratschläge entgegen.
Die example.php ist auch nicht wirklich fertig. In der finalen Version soll man nur noch an der entscheidenden Stelle die captcha.php includen und die macht den Rest.
Nun bin ich kein Profi darin und habe auch keinerlei fachliche Ausbildung in diesem Bereich, deshalb bin ich nun offen für jedwede Verbesserung:
txtcaptcha.class.php
PHP:
<?php
/**
* txtcaptcha.class.php, txtCaptcha
*
* This file is used to read, show and validate the Questions
* @author Felix Jacobi <root@flexmex.net>
* @version 0.1
* @copyright 2007
*
*/
class txtCaptcha {
protected $_config;
protected $_questions;
protected $_solutions;
public $question;
/**
* Creates Database Connection
*
* @param array $config
*/
public function __construct($config)
{
$this->_config = $config;
if($this->_config['debug'] == "false") {
error_reporting(0);
} else error_reporting(E_ALL);
$this->_conn = mysqli_connect($this->_config['db']['host'],
$this->_config['db']['user'],
$this->_config['db']['pass'],
$this->_config['db']['dbname']);
}
/**
* Reads all Questions into $this->_questions
*
*/
protected function _getQuestions()
{
$sql = "SELECT `id`, `question`
FROM `txtcaptcha`";
$result = mysqli_query($this->_conn, $sql) or die(mysqli_error($this->_conn));
while($row = mysqli_fetch_assoc($result))
{
$this->_questions[$row['id']] = $row['question'];
}
}
/**
* Returns a random Question out of the database
*
* @return array Random Question and ID
*/
protected function _randQuestion()
{
srand((float)microtime() * 1000000);
$id = array_rand($this->_questions);
$this->question['question'] = $this->_questions[$id];
$this->question['id'] = md5($id);
}
/**
* checks if the given Answer is correct
*
* @return bool
*/
public function checkAnswer()
{
if(get_magic_quotes_gpc() === true) {
$post_id = mysqli_real_escape_string($this->_conn, stripslashes($_POST['txtcaptcha_id']));
} else {
$post_id = mysqli_real_escape_string($this->_conn, $_POST['txtcaptcha_id']);
}
$sql = "SELECT `id`
FROM `txtcaptcha`
WHERE MD5(`id`) = '".$post_id."'
AND `answer` = '".(int)$_POST['txtcaptcha_answer']."'";
$result = mysqli_query($this->_conn, $sql);
$status = mysqli_num_rows($result);
if($status == '0') {
return false;
} else return true;
}
/**
* Returns the question to public
*
* @return array random Question
*/
public function showQuestion()
{
$this->_getQuestions();
$this->_randQuestion();
return $this->question;
}
}
example.php
PHP:
<pre>
<?php
include_once("txtcaptcha.class.php");
/* Config */
$config['db']['host'] = "localhost";
$config['db']['user'] = "root";
$config['db']['pass'] = "";
$config['db']['dbname'] = "test";
$config['debug'] = "true";
$txtCaptcha = new txtCaptcha($config);
$question = $txtCaptcha->showQuestion();
if(isset($_POST['submit'])) {
if($txtCaptcha->checkAnswer() === true) echo "ja<br/>";
else echo "nein<br/>";
}
?>
<form action="./example.php" method="post">
<label for="txtcaptcha_answer"><?php echo $question['question']; ?></label>
<input type="text" name="txtcaptcha_answer" />
<input type="hidden" name="txtcaptcha_id" value="<?php echo $question['id']; ?>" />
<input type="submit" name="submit" value="send" />
</form>
</pre>
Das ganze gibts hier auch nochmal als Source zu begutachten:
http://dev.flexmex.net/temp/txtcaptcha.class.phps
http://dev.flexmex.net/temp/example.phps
Die Kommentare sind mir leider nicht so gut gelungen (sollen möglichst phpDoc valide sein), da nehme ich auch gerne Ratschläge entgegen.
Die example.php ist auch nicht wirklich fertig. In der finalen Version soll man nur noch an der entscheidenden Stelle die captcha.php includen und die macht den Rest.
Zuletzt bearbeitet: