ugrás a tartalomhoz

Szóellenőrző forrás minősége

Vas Dávid · 2007. Aug. 11. (Szo), 18.41
Üdv!

Igencsak sok oldalon látni azt a bizonyos szóellenőrzőt, ami betűket (szót) kér a felhasználótól, majd ellenőrzi, hogy az van-e a képen és ha igen, akkor enged regisztrálni (vagy bármi mást), ha nem akkor pedig kiír valamiféle hibaüzenetet.

Mivel én ilyet személy szerint nem szoktam csinálni, ezért neki láttam egynek, gondoltam megcsinálom 5 perc alatt, de szerintem fél óra is lett belőle...
És nem tudom mennyire kielégítő, szerintem vessetek rá egy pillantást, és mondjátok meg légyszíves, hogy ér-e egyáltalán valamit, vagy mehet a lomtárba...

Bocs, hogy bemásolom az egész forrást, de sajnos jelen pillanatban nincs hova feltöltenem.

2 fájl van, az alap index.php és a képet generáló checker_img_create.php

index.php:
<?php

session_start();

include_once("checker_img_create.php");

if (!isset($_SESSION['letter1'])) {

	$rand_letters = random_letter();
	$rand_letters_array = explode(":", $rand_letters);

	$_SESSION['letter1'] = $rand_letters_array['0'];
	$_SESSION['letter2'] = $rand_letters_array['1'];
	$_SESSION['letter3'] = $rand_letters_array['2'];
	$_SESSION['letter4'] = $rand_letters_array['3'];

	$_SESSION['full_word'] = "$_SESSION[letter1]$_SESSION[letter2]$_SESSION[letter3]$_SESSION[letter4]";

}

function display_message($msg) {

		if (isset($_POST['op'])) {

			print "\n<p>$msg</p>";
			
		}
	
}

if (isset($_POST['op'])) {

	if ($_POST['word'] != $_SESSION['full_word']) {
	
		$message = "Hiba! A képen látható szó és a begépelt szó nem egyezik!";
		
		$rand_letters = random_letter();
		$rand_letters_array = explode(":", $rand_letters);

		$_SESSION['letter1'] = $rand_letters_array['0'];
		$_SESSION['letter2'] = $rand_letters_array['1'];
		$_SESSION['letter3'] = $rand_letters_array['2'];
		$_SESSION['letter4'] = $rand_letters_array['3'];

		$_SESSION['full_word'] = "$_SESSION[letter1]$_SESSION[letter2]$_SESSION[letter3]$_SESSION[letter4]";
		
	}
	
	else {
	
		$message = "Helyes a begépelt szó!";
		
	}
	
}

?>
<html>
<head>
<title>Szóellenőrzés</title>
</head>
<body><?php display_message($message); ?>

<form action="index.php" method="post">
<p>
<fieldset><legend>Szóellenőrzés</legend>
<img src="checker_img_create.php?create=yes" alt="" border="0" />
<br />
Írd be a képen látható szót.
<br />
<br />
<label for="word">A szó: *</legend>
<input type="text" name="word" id="word" size="10" value="" />
</fieldset>
<p>
<input type="submit" name="op" value="Ellenőríz" />
</p>
</form>
</body>
</html>
checker_img_create.php:
<?php

session_start();

function random_letter() {

	$letters = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");

	$rand1 = rand(0, count($letters) - 1);
	$rand2 = rand(0, count($letters) - 1);
	$rand3 = rand(0, count($letters) - 1);
	$rand4 = rand(0, count($letters) - 1);

	$letter1 = $letters[$rand1];
	$letter2 = $letters[$rand2];
	$letter3 = $letters[$rand3];
	$letter4 = $letters[$rand4];
	
	$letter_pack = "$letter1:$letter2:$letter3:$letter4";
	
	return $letter_pack;
	
}

function checker_img_create($letter1, $letter2, $letter3, $letter4) {

	header("Content-type: image/jpeg");

	$img = imagecreate(150, 40);
	$black = imagecolorallocate($img, 0,0,0);
	$white = imagecolorallocate($img, 255,255,255);

	imagestring($img, 5, 40, 15, $letter1, $white);
	imagestring($img, 5, 60, 15, $letter2, $white);
	imagestring($img, 5, 80, 15, $letter3, $white);
	imagestring($img, 5, 100, 15, $letter4, $white);

	imagejpeg($img);

}

if ($_GET['create'] == "yes") {

	checker_img_create($_SESSION['letter1'], $_SESSION['letter2'], $_SESSION['letter3'], $_SESSION['letter4']);

}

?>
 
1

változók

true.fx · 2007. Aug. 11. (Szo), 23.01
Nekem az összes problémám az ehhez hasonló megoldásaiddal lenne:

 $rand1 = rand(0, count($letters) - 1);  
 $rand2 = rand(0, count($letters) - 1);  
 $rand3 = rand(0, count($letters) - 1);  
 $rand4 = rand(0, count($letters) - 1);
Az ilyesmit ciklusokkal és tömbökkel illene megoldani. Mi lesz akkor, ha a megrendelő megkér, hogy inkább 5 karakterből álljon a captcha az oldalon? Akkor ezt a programot csomó helyen kell módosítani. Ird át úgy, hogy a generált string hossza egy konstansban legyen eltárolva, amit bármikor módosíthatsz.
2

ez csak egy alap

Vas Dávid · 2007. Aug. 12. (V), 01.52
true.fx kössz a tanácsot/észrevételt, de ez csak egy alap cucc, ezért nem is akartam megcsinálni, mert ugye több időre lett volna szükség hozzá és nem erre mentem.
Persze ha valahol tényleg felakarom használni akár több helyen is, és csak egyszer akarom megírni akkor "bevetném" azt, hogy lehessen állítani.

Más hibája nincsen?
3

Pár megjegyzés

attlad · 2007. Aug. 12. (V), 15.57
Ez így nem feltétlenül működik jól párhuzamosan, ha pl. kommenthez van berakva és több oldalt nyit meg egyszerre az user füleken és utána küldené a hozzászólásokat. Nem értelmes szavakat generál, pedig azt gyorsabb begépelni. Csak nagybetűvel fogadja el. Ez így önmagában vsz könnyen törhető OCR progival.

(Szerintem ha csak lehet, érdemes elkerülni ezt a fajta ellenőrzést.)
4

törhető?

Vas Dávid · 2007. Aug. 12. (V), 17.58
attlad, bocs de nem értem ezen mit kéne törni...

Ha valaki vesz magán annyi erőt hogy felmegy az oldalra mondjuk, akkor nem hiszem hogy ha ezt meglátja akkor neki áll feltörni mikor beüt 4 betűt aztán kész is... vagy nem értem.

+ mit mondtam ez csak egy csonk, mert egyenlőre nem tervezem az ilyen használatát...

Az értelmes szavak megfontolandó, csak ahhoz kéne egy "szótár" ugye, mit tudom én mondjuk 1000 magyar szó egy tömbben vagy ilyesmi.

És mit tudnék tenni hogy CR progival ne lehessen törni?

Azért kössz a hozzászólást! még várok ilyeneket amik a hibákra mutatnak rá...
5

Igen

attlad · 2007. Aug. 12. (V), 19.10
Nyilván azért szokott ilyen lenni, hogy kiszűrje a különböző automatizmusokat, robotokat, vagyis a nem embereket. Egy spambot nem biztos, hogy meg akarja majd törni és ott elég is lehet (habár vannak barátságosabb technikák a CAPTCHA helyett), de pl. egy rapidshare vagy hasonló helyen, ahol kicsit nagyobb érdeke fűződik az usereknek ennek a megkerülésére, ott már nem igazán lenne jó, mert pl. a fizetős rész egyik plusz szolgáltatása, hogy nem kell ilyen kódokat beírogatni a webhely használatához.

Gépek számára nehezebben felismerhetővé szokták tenni speciális betűtípussal, különböző transzformációkkal, effektekkel.