PHP Captcha segítség
PHP captcha, mely a regisztrációnál folyamatosan rossz karakterkombinációnak érzékeli a beírt kódot, még akkor is ha a képen látható karakterekkel megegyezik, a beírt karakterkombináció.
Üdv mindenkinek !
Lenne egy kis problémám, írtam egy regisztrációs php-t amely sql adatbázisba menti az adatokat.
Ez eddig működik is, de megpróbáltam a regisztrációt kicsit "nehezíteni" a "botok" számára, így létrehoztam egy php captchát mely így néz ki :
Maga a captcha kép kódja :
És maga a regisztrációs php :
(A feketével keretezett részek a captcha kódok)
Nos térjünk is ki a problémára. A regisztráció, az ellenőrzéssel együtt tökéletesen működik, míg el nem jutunk a captchához. A probléma a captchával pedig az, hogy a felhasználó a regisztrációnál hiába írja be a képen látható helyes kódot, a captcha nem fogja elfogadni.
Ezt szeretném megoldani, nem kérem hogy oldjátok meg helyettem, sőt inkább csak példákkal dobálózzatok, vagy célozgatással, mert zseretném megtanulni, hogy mégis hogyan kell ezt "működőképesre" megírni :D
Előre is köszönöm !
■ Üdv mindenkinek !
Lenne egy kis problémám, írtam egy regisztrációs php-t amely sql adatbázisba menti az adatokat.
Ez eddig működik is, de megpróbáltam a regisztrációt kicsit "nehezíteni" a "botok" számára, így létrehoztam egy php captchát mely így néz ki :
<?php
session_start();
header("Content-type: image/jpeg");
// többi kód...
$im=imagecreatetruecolor(150,40);
$feher=imagecolorallocate($im,255,255,255);
$fekete=imagecolorallocate($im,0,0,0);
$szurke=imagecolorallocate($im,125,125,125);
$chars="abcdefghijklmnopqrstuvwxyz23456789?!";
$str="";
for ($i=0;$i<6;$i++){
$rand=rand(0,strlen($chars)-1);
$str.=$chars[$rand];
$_SESSION["captcha"]=$str;
imagefill($im,0,0,$feher);
imagettftext($im,20,0,12,32,$szurke,"font.ttf",$str);
imagettftext($im,20,0,10,30,$fekete,"font.ttf",$str);
imagejpeg($im);
imagedestroy($im);
?>
session_start();
header("Content-type: image/jpeg");
// többi kód...
$im=imagecreatetruecolor(150,40);
$feher=imagecolorallocate($im,255,255,255);
$fekete=imagecolorallocate($im,0,0,0);
$szurke=imagecolorallocate($im,125,125,125);
$chars="abcdefghijklmnopqrstuvwxyz23456789?!";
$str="";
for ($i=0;$i<6;$i++){
$rand=rand(0,strlen($chars)-1);
$str.=$chars[$rand];
$_SESSION["captcha"]=$str;
imagefill($im,0,0,$feher);
imagettftext($im,20,0,12,32,$szurke,"font.ttf",$str);
imagettftext($im,20,0,10,30,$fekete,"font.ttf",$str);
imagejpeg($im);
imagedestroy($im);
?>
Maga a captcha kép kódja :
<?php
session_start();
function random($lenght){
$chars = "abcdefghijklmnopqrstuvwxyz23456789?!";
$str = "";
$size = strlen($chars);
for($i=0;$i<$lenght;$i++){
$str .= $chars[rand(0, $size-1)];
}
return $str;
}
$cap = random(7);
$_SESSION['real'] = $cap;
$image = imagecreate(100, 20);
$background = imagecolorallocate($image, 0,0,0);
$foreground = imagecolorallocate($image, 255,255,255);
imagestring($image, 5,5,1,$cap,$foreground);
header("Content-type: image/jpeg");
imagejpeg($image);
?>
session_start();
function random($lenght){
$chars = "abcdefghijklmnopqrstuvwxyz23456789?!";
$str = "";
$size = strlen($chars);
for($i=0;$i<$lenght;$i++){
$str .= $chars[rand(0, $size-1)];
}
return $str;
}
$cap = random(7);
$_SESSION['real'] = $cap;
$image = imagecreate(100, 20);
$background = imagecolorallocate($image, 0,0,0);
$foreground = imagecolorallocate($image, 255,255,255);
imagestring($image, 5,5,1,$cap,$foreground);
header("Content-type: image/jpeg");
imagejpeg($image);
?>
És maga a regisztrációs php :
(A feketével keretezett részek a captcha kódok)
<?php
echo '<h1>Regisztráció</h1>';
$submit = $_POST['submit'];
//form data
$fullname = strip_tags($_POST['fullname']);
$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['password']);
$repeatpassword = strip_tags($_POST['repeatpassword']);
$email = strip_tags($_POST['email']);
$repeatemail = strip_tags($_POST['repeatemail']);
$captcha = strip_tags($_POST['captcha']);
$real = $_SESSION['real'];
$guess = $_POST['captcha'];
$name = $_POST['name'];
$date = date("y-m-d");
if ($submit)
{
// if ($captcha == $_SESSION['captcha'])
if ($captcha == $_SESSION['captcha'] && $real == $guess)
{
//check for existance
if ($fullname&&$username&&$password&&$repeatpassword&&$email&&$repeatemail)
{
$connect = mysql_connect("localhost","root","slipknot456");
mysql_select_db("tisimuvek");//select database
$namecheck = mysql_query("SELECT username FROM users WHERE username='$username'");
$count = mysql_num_rows($namecheck);
if ($count!=0)
{
die("Ilyen nevű felhasználó már létezik!");
}
if ($password==$repeatpassword)
{
if ($email==$repeatemail)
{
//check char lenght of username and fullname
if (strlen($username)>32||strlen($fullname)>64)
{
echo "Túl hosszú>Teljes</b>, vagy <b>Felhasznánálónév</b>!";
}
else
{
//check password lenght
if (strlen($password)>64||strlen($password)<6)
{
echo "A jelszónak minimum 6, maximum 64 karakterbőell kell hogy álljonn!";
}
else
{
//register the user!
// encrypt password
$password = $password;
$repeatpassword = $repeatpassword;
//open database
$con = mysql_connect("localhost","root","slipknot456");
if (!$con)
{
die("Nem lehet felkapcsolódni a szerverre, próbálja prár percel késobb ! <a href='index.html'></a> " . mysql_error());
}
else
{
$db = mysql_select_db("tisimuvek", $con);
if (!$db)
{
die('Nincs ilyen nevű adatbázis: ' . mysql_error());
}
else
{
$ins = mysql_query("
INSERT INTO users (fullname, username, password, email, date)
VALUES ('$fullname', '$username', '$password', '$email', '$date')
");
if (!$ins)
{
die('Nincs ilyen nevű tábla, vagy mező: ' . mysql_error());
}
}
}
mysql_close($con);
die ("Siker!! <a href='index.html'> Vissza a főoldalra.</a>");
}
}
}
else
echo "Az email-címek nem egyeznek!";
}
else
echo "A jelszavak nem egyeznek!";
}
else
echo "Kérlek töltsd ki az <b>Összes</b> mezőt!";
}
else
echo "A beírt kód helytelen !";
}
?>
<html>
<p>
<form action='register.php' method='POST'>
<table>
<tr>
<td>
Teljes neve :
</td>
<td>
<input type='text' name='fullname' value='<?php echo $fullname; ?>'>
</td>
</tr>
<tr>
<td>
Felhasználó neve :
</td>
<td>
<input type='text' name='username' value='<?php echo $username; ?>'>
</td>
</tr>
<tr>
<td>
Jelszava :
</td>
<td>
<input type='password' name='password'>
</td>
</tr>
<tr>
<td>
Ismételje meg jelszavát :
</td>
<td>
<input type='password' name='repeatpassword'>
</td>
</tr>
<tr>
<td>
Email-címe :
</td>
<td>
<input type='text' name='email' value='<?php echo $email; ?>'>
</td>
</tr>
<tr>
<td>
Ismételje meg email-címét :
</td>
<td>
<input type='text' name='repeatemail' value='<?php echo $repeatemail; ?>'>
</td>
</tr>
<tr>
<td>
Kérlek írd be a képen látható kódot !<br></br>
</td>
<td>
<img src='image.php'> <br> <input type='text' name='captcha'/> </br>
</td>
</tr>
</table>
<p>
<input type='submit' name='submit' value='Register'>
</form>
</html>
echo '<h1>Regisztráció</h1>';
$submit = $_POST['submit'];
//form data
$fullname = strip_tags($_POST['fullname']);
$username = strip_tags($_POST['username']);
$password = strip_tags($_POST['password']);
$repeatpassword = strip_tags($_POST['repeatpassword']);
$email = strip_tags($_POST['email']);
$repeatemail = strip_tags($_POST['repeatemail']);
$captcha = strip_tags($_POST['captcha']);
$real = $_SESSION['real'];
$guess = $_POST['captcha'];
$name = $_POST['name'];
$date = date("y-m-d");
if ($submit)
{
// if ($captcha == $_SESSION['captcha'])
if ($captcha == $_SESSION['captcha'] && $real == $guess)
{
//check for existance
if ($fullname&&$username&&$password&&$repeatpassword&&$email&&$repeatemail)
{
$connect = mysql_connect("localhost","root","slipknot456");
mysql_select_db("tisimuvek");//select database
$namecheck = mysql_query("SELECT username FROM users WHERE username='$username'");
$count = mysql_num_rows($namecheck);
if ($count!=0)
{
die("Ilyen nevű felhasználó már létezik!");
}
if ($password==$repeatpassword)
{
if ($email==$repeatemail)
{
//check char lenght of username and fullname
if (strlen($username)>32||strlen($fullname)>64)
{
echo "Túl hosszú>Teljes</b>, vagy <b>Felhasznánálónév</b>!";
}
else
{
//check password lenght
if (strlen($password)>64||strlen($password)<6)
{
echo "A jelszónak minimum 6, maximum 64 karakterbőell kell hogy álljonn!";
}
else
{
//register the user!
// encrypt password
$password = $password;
$repeatpassword = $repeatpassword;
//open database
$con = mysql_connect("localhost","root","slipknot456");
if (!$con)
{
die("Nem lehet felkapcsolódni a szerverre, próbálja prár percel késobb ! <a href='index.html'></a> " . mysql_error());
}
else
{
$db = mysql_select_db("tisimuvek", $con);
if (!$db)
{
die('Nincs ilyen nevű adatbázis: ' . mysql_error());
}
else
{
$ins = mysql_query("
INSERT INTO users (fullname, username, password, email, date)
VALUES ('$fullname', '$username', '$password', '$email', '$date')
");
if (!$ins)
{
die('Nincs ilyen nevű tábla, vagy mező: ' . mysql_error());
}
}
}
mysql_close($con);
die ("Siker!! <a href='index.html'> Vissza a főoldalra.</a>");
}
}
}
else
echo "Az email-címek nem egyeznek!";
}
else
echo "A jelszavak nem egyeznek!";
}
else
echo "Kérlek töltsd ki az <b>Összes</b> mezőt!";
}
else
echo "A beírt kód helytelen !";
}
?>
<html>
<p>
<form action='register.php' method='POST'>
<table>
<tr>
<td>
Teljes neve :
</td>
<td>
<input type='text' name='fullname' value='<?php echo $fullname; ?>'>
</td>
</tr>
<tr>
<td>
Felhasználó neve :
</td>
<td>
<input type='text' name='username' value='<?php echo $username; ?>'>
</td>
</tr>
<tr>
<td>
Jelszava :
</td>
<td>
<input type='password' name='password'>
</td>
</tr>
<tr>
<td>
Ismételje meg jelszavát :
</td>
<td>
<input type='password' name='repeatpassword'>
</td>
</tr>
<tr>
<td>
Email-címe :
</td>
<td>
<input type='text' name='email' value='<?php echo $email; ?>'>
</td>
</tr>
<tr>
<td>
Ismételje meg email-címét :
</td>
<td>
<input type='text' name='repeatemail' value='<?php echo $repeatemail; ?>'>
</td>
</tr>
<tr>
<td>
Kérlek írd be a képen látható kódot !<br></br>
</td>
<td>
<img src='image.php'> <br> <input type='text' name='captcha'/> </br>
</td>
</tr>
</table>
<p>
<input type='submit' name='submit' value='Register'>
</form>
</html>
Nos térjünk is ki a problémára. A regisztráció, az ellenőrzéssel együtt tökéletesen működik, míg el nem jutunk a captchához. A probléma a captchával pedig az, hogy a felhasználó a regisztrációnál hiába írja be a képen látható helyes kódot, a captcha nem fogja elfogadni.
Ezt szeretném megoldani, nem kérem hogy oldjátok meg helyettem, sőt inkább csak példákkal dobálózzatok, vagy célozgatással, mert zseretném megtanulni, hogy mégis hogyan kell ezt "működőképesre" megírni :D
Előre is köszönöm !
Kód
Nem értem
Szöveget küldj. Képben nem
(Ha pedig mindenképpen kép, akkor vagy ne legyen BMP, vagy ne legyen összesen 17Mb, vagy ne modemes sebességgel kelljen kivárjuk a saját gépedről. Ez így mind egybe a kegyetlenség határát súrolja.)
BMP-JPG
Felraktam a 2 kisebb php-t kódban is, de a nagyobbal inkább nem csinálom meg, mert :
- 1 túl hosszú lenne
- 2 ha rövidíteném, nem tudom hogy mi lenne hasznos számodra
biztos vagy benne, hogy a
azért szar amúgy a kép, mert nem bírod belőle könnyen kimásolni a kódot és tesztelni saját gépen, hogy mi nem működik.. no de mindegy.
amúgy mi történik, ha a regisztrációkor azt írod a felhasználónévbe, hogy
';delete * from users; --
Nem tudom
fellöktem a kódokat a két kisebb képről, de ha akarod fellököm a "nagyobbról" is.
És nem tudom, még nem próbáltam.
Mire gondolsz, mi történne?
akkor így mondom. nincs
session_start();
hívás a register.php-ban.
a másikat meg próbáld ki :)
Nem történik semmi, mert a
(ettől persze igazad van)
tudtam, hogy valamit be fogok