Ha phpers,

ik heb een beveiliging voor een formuliertje (niet zelf geschreven, maar van iemand anders. Die heeft hem denk ik ergens van internet gehaald).

hiermee roep ik hem aan:

<?php
$spam = trim($_POST['spam']);

include("securimage.php");
$img = new Securimage();
$valid = $img->check($_POST['spam']);

if($valid == false) {
$aFout[] = "De ingevoerde code is onjuist.";
unset($spam);
$fout['text']['spam'] = TRUE;
$fout['input']['spam'] = TRUE;
}
?>

in de construct functie van Securimage() staat niks.

<?php
function check($code)
{
$this->code_entered = $code;
$this->validate();
return $this->correct_code;
}

function validate()
{
if ( isset($_SESSION['securimage_code_value']) && !empty($_SESSION['securimage_code_value']) ) {
if ( $_SESSION['securimage_code_value'] == strtolower(trim($this->code_entered)) ) {
$this->correct_code = true;
$_SESSION['securimage_code_value'] = '';
} else {
$this->correct_code = false;
}
} else {
$this->correct_code = false;
}
}

?>

Nu is het zo dat $valid steevast false teruggeeft, ongeacht de invoer.
Hoe kan dit komen? Heeft iemand ervaring met zulke dingen?
het komt volgens mij omdat je het verkeerde returnt in function check:

je returnt nu de code die hij eerder via de POST meekrijgt

edit: stukje voorbeeld:


<?php
  function check($code)
  {
    $this->code_entered = $code;
    return  $this->validate();
  }

  function validate()
  {
    if ( isset($_SESSION['securimage_code_value']) && !empty($_SESSION['securimage_code_value']) ) {
      if ( $_SESSION['securimage_code_value'] == strtolower(trim($this->code_entered)) ) {
        return true;
        $_SESSION['securimage_code_value'] = '';
      } else {
       return false;
      }
    } else {
      return false;
    }
  }

?>
nee. De code die hij binnenkrijgt zet hij in: $this->code_entered

Vervolgens kijkt validate() naar: if ( $_SESSION['securimage_code_value'] == strtolower(trim($this->code_entered)) )

Zo ja: $this->correct_code = true
Zo nee: $this->correct_code = false

Hij returnt vervolgens $this->correct_code en dus niet $this->code_entered

@Mick ForSure:
werkt ook niet. Ik ben er inmiddels achter dat hij bij het schrijven van de image helemaal de waarde niet in de sessie zet.

Ik zet het plaatje zo op de site:


<img src="securimage_show.php?sid=<?php echo md5(uniqid(time())); ?>">


secureimage_show.php:
<?php

include 'securimage.php';

$img = new Securimage();

$img->show(); // alternate use: $img->show('/path/to/background.jpg');

?>

<?php
function show($background_image = "")
{
if($background_image != "" && is_readable($background_image)) {
$this->bgimg = $background_image;
}

$this->doImage();
}

function doImage()
{
if($this->use_transparent_text == true || $this->bgimg != "") {
$this->im = imagecreatetruecolor($this->image_width, $this->image_height);
$bgcolor = imagecolorallocate($this->im, hexdec(substr($this->image_bg_color, 1, 2)), hexdec(substr($this->image_bg_color, 3, 2)), hexdec(substr($this->image_bg_color, 5, 2)));
imagefilledrectangle($this->im, 0, 0, imagesx($this->im), imagesy($this->im), $bgcolor);
} else { //no transparency
$this->im = imagecreate($this->image_width, $this->image_height);
$bgcolor = imagecolorallocate($this->im, hexdec(substr($this->image_bg_color, 1, 2)), hexdec(substr($this->image_bg_color, 3, 2)), hexdec(substr($this->image_bg_color, 5, 2)));
}

if($this->bgimg != "") { $this->setBackground(); }

$this->createCode();

if (!$this->draw_lines_over_text && $this->draw_lines) $this->drawLines();

$this->drawWord();

if ($this->arc_linethrough == true) $this->arcLines();

if ($this->draw_lines_over_text && $this->draw_lines) $this->drawLines();

$this->output();

}

function createCode()
{
$this->code = false;

if ($this->use_wordlist && is_readable($this->wordlist_file)) {
$this->code = $this->readCodeFromFile();
}

if ($this->code == false) {
$this->code = $this->generateCode($this->code_length);
}

}
function generateCode($len)
{
$code = '';

for($i = 1, $cslen = strlen($this->charset); $i <= $len; ++$i) {
$code .= strtoupper( $this->charset{rand(0, $cslen - 1)} );
}
return $code;
}
?>

Nu heb ik de volgende functie nog:

<?php
function saveData()
{
$_SESSION['securimage_code_value'] = strtolower($this->code);
}
?>

Deze wordt echter nergens aangeroepen (dus zet hij de code niet in de sessie. Waar zou ik die neer moeten zetten?
nou op het moment dat de post gegevens kloppen neem ik aan? ook moet je zorgen dat je sessie gestart wordt...

session_start();
session_start() staat bovenaan pagina, dus dat kan geen probleem zijn.
Volgens mij moet hij dat geval in de sessie zetten als hij het plaatje maakt. Maar wat ik ook probeer, hij doet het niet :S

Reageren