PDA

View Full Version : سوال: مشکل با اشتباه بودن کد کپچا (حل شد)



saeed-71
سه شنبه 30 مهر 1392, 07:54 صبح
سلام.
بعضی از کاربرای سایتم بهم زنگ میزنن میگن هر چی کد امنیتی رو وارد میکنن میگه اشتباه است!

دلیلش چی میونه باشه؟

saeed-71
سه شنبه 30 مهر 1392, 07:59 صبح
این کد کپچا



<?php
session_start();
function random_string($len=5, $str='')
{ for($i=1; $i<=$len; $i++ )
{ //generates a random number that will be the ASCII code of the character.
//We only want numbers (ascii code from 48 to 57) and caps letters.
$ord=rand(50, 90);
if((($ord >= 48) && ($ord <= 57)) || (($ord >= 65) && ($ord<= 90)))
$str.=chr($ord); //If the number is not good we generate another one
else $str.=random_string(1);
} return $str;}
//create the random string using the upper function
//(if you want more than 5 characters just modify the parameter)
$rand_str=random_string(5);
// جدا کردن رشته به صورت 5 کاراکتر
$letter1=substr($rand_str,0,1);
$letter2=substr($rand_str,1,1);
$letter3=substr($rand_str,2,1);
$letter4=substr($rand_str,3,1);
$letter5=substr($rand_str,4,1);
//Creates an image from a png file. If you want to use gif or jpg images,
//just use the coresponding functions: imagecreatefromjpeg and imagecreatefromgif.
$image=imagecreatefrompng("css/images/verify.png");
//Get a random angle for each letter to be rotated with.
// تعیین زاویه نمایش کاراکترها
$angle1 = rand(-20, 20);
$angle2 = rand(-20, 20);
$angle3 = rand(-20, 20);
$angle4 = rand(-20, 20);
$angle5 = rand(-20, 20);
//Get a random font. (In this examples, the fonts are located in "fonts" directory and named from 1.ttf to 10.ttf)
// تعیین فونت برای نمایش هر یک از کاراکترها

$font1 = 'font/'.rand(1,1).'.ttf';
$font2 = 'font/'.rand(1,1).'.ttf';
$font3 = 'font/'.rand(1,1).'.ttf';
$font4 = 'font/'.rand(1,1).'.ttf';
$font5 = 'font/'.rand(1,1).'.ttf';


//Define a table with colors (the values are the RGB components for each color).

//Get a random color for each letter.
// تعیین رنگ برای هر یک از کاراکتر ها

$color1=rand(0,255);
$color2=rand(0,255);
$color3=rand(0,255);
$color4=rand(0,255);
$color5=rand(0,255);

//Allocate colors for letters.
$textColor1 = imagecolorallocate ($image, $color1,10, $color3);
$textColor2 = imagecolorallocate ($image, $color4,13, $color2);
$textColor3 = imagecolorallocate ($image, $color2,20, $color1);
$textColor4 = imagecolorallocate ($image, $color3,10, $color5);
$textColor5 = imagecolorallocate ($image, $color5,20, $color4);

//Write text to the image using TrueType fonts.
// تعیین سایز برای هر یک از کاراکترها
$size1 = rand(17,20);
$size2 = rand(17,20);
$size3 = rand(17,20);
$size4 = rand(17,20);
$size5 = rand(17,20);
// تعیین موقعیت نمایش برای هر کدام از کاراکترها
$y_pos1 = rand(18,28);
$y_pos2 = rand(18,28);
$y_pos3 = rand(18,28);
$y_pos4 = rand(18,28);
$y_pos5 = rand(18,28);

imagettftext($image, $size1, $angle1, 10, $y_pos1, $textColor1, $font1, $letter1);
imagettftext($image, $size2, $angle2, 30, $y_pos2, $textColor2, $font2, $letter2);
imagettftext($image, $size3, $angle3, 55, $y_pos3, $textColor3, $font3, $letter3);
imagettftext($image, $size4, $angle4, 75, $y_pos4, $textColor4, $font4, $letter4);
imagettftext($image, $size5, $angle5, 92, $y_pos5, $textColor5, $font5, $letter5);

$_SESSION['captcha'] = $rand_str;

header("Content-type: image/png");
//Output image to browser
//imagejpeg($image);
imagepng($image);
//Destroys the
imagedestroy($image);



?>

MMSHFE
سه شنبه 30 مهر 1392, 07:59 صبح
دلیلش اینه که شما کد و نمونه CAPTCHA خودتون رو نگذاشتین تا ببینیم مشکل از کجاست! معمولاً توی CAPTCHA حساسیت به بزرگی و کوچکی حروف رو بر میدارن. شاید بخاطر اون باشه. یا شاید توی فونت شما 0 و O خیلی شبیه به همه یا مثلاً I و l (آی بزرگ و ال کوچک). چنین مواردی زیاد باعث اشتباه میشه که باید دقت زیادی داشته باشن. برای رفع مثلاً توی نمایش CAPTCHA از فونت خوانا استفاده کنید یا فقط از یک شکل حروف (بزرگ یا کوچک) استفاده کنید. یا مثلاً اعداد رو با اندازه متفاوت یا رنگ دیگه نشون بدین. خیلی کارها میشه کرد اما اول باید ببینیم مشکل از کجاست.

saeed-71
سه شنبه 30 مهر 1392, 07:59 صبح
این مقایسش



if(strcmp($_POST['captcha'],$_SESSION['captcha'])!=0)
{
$_SESSION['mr']="کد وارد شده از تصویر امنیتی اشتباه وارد شده است لطفا تصویر امنیتی را بررسی نمایید و مجددا وارد کنید";
header("location:register.php");
}
else{

مهرداد سیف زاده
سه شنبه 30 مهر 1392, 08:54 صبح
با توجه بر حساسیت حروف
مشکل دیگر در نگهداری captcha در session هست. بارها برای من پیش اومده در هنگام ساخت captcha یه کدی در session قرار گرفته و در هنگام نمایش همون captcha کد درون session عوض شده و با تصویر نشون داده شده هماهنگ نیست. هر چند استاندارد این هست صفحه‌ای که داره لود میشه باید کاراکترهای captcha رو در session قرار بده ولی باز هم مشکل در بعضی هاست‌ها بوجود میاد
من این گونه مشکلات رو با ajax‌حل میکنم. به این صورت که بعد لود کامل صفحه یک درخواست ajax به سمت تابع captcha‌میفرستم و بعد از ساخته شدن captcha و قرارگیری کاراکترها در session اون رو نمایش میدم. در واقع با این کار خیالتون از بابت هماهنگی captcha با کاراکترهای session راحت میشه.

برای تست برنامه شما در صفحه‌ای که captcha نشون داده میشه کاراکترهای session رو هم بر روی صفحه چاپ کنید تا از هماهنگی تصویر نشون داده شده با کاراکترهای موجود در session اطلاع کسب کنید.

Reza1607
سه شنبه 30 مهر 1392, 11:03 صبح
یک احتمال دیگه که وجود داره ( البته فکر نکنم این باشه و برای اطلاعات بیشتر میگم ) این هست که شما در زمانی که صفحه رو ارسال می کنید قبل از چک کردن کد وارد شده توسط کاربر با مقدار سشن یک کد کپچا دیگه تولید می کنید به همین دلیل همیشه کد اشتباه هست
به نظر برای مشکل شما جواب آقای شهرکی درست باشه

saeed-71
چهارشنبه 01 آبان 1392, 19:53 عصر
اقا من خودمم چک مکنم میبینم حق با اوناست
درست وارد میکنم میگه اشتباست!
چیش اشتباهه؟

saeed-71
چهارشنبه 01 آبان 1392, 20:09 عصر
فک کنم مشکل از سرور هستش اخه کد کپچا رو بر داشتم بازم بعد چند ثانیه که سایت رفرش میشد دوباره از حالت لاگین خارج میشد!نمیدونم مال چیه!

saeed-71
پنج شنبه 02 آبان 1392, 13:00 عصر
یک احتمال دیگه که وجود داره ( البته فکر نکنم این باشه و برای اطلاعات بیشتر میگم ) این هست که شما در زمانی که صفحه رو ارسال می کنید قبل از چک کردن کد وارد شده توسط کاربر با مقدار سشن یک کد کپچا دیگه تولید می کنید به همین دلیل همیشه کد اشتباه هست
به نظر برای مشکل شما جواب آقای شهرکی درست باشه
خوب راه حلش چیه؟

omidabedi
پنج شنبه 02 آبان 1392, 14:14 عصر
داداش بنظر من خودتو اذیت نکن
راحت یه امادشو بگیر استفاده کن مثل re-captcha یا چند تا دیگه
از همه لحاظ هم خیالت جمع هست
یه چیز دیگه
تست کن ببین از اخر به اول بزنی درست میشه؟کپچا رو یعنی بر عکس وارد کن از اخرین کارکتر به اولین

Reza1607
پنج شنبه 02 آبان 1392, 18:41 عصر
خوب راه حلش چیه؟

خوب از تولید کپچا اطلاعات وارد شده کاربر رو چک کن

MMSHFE
پنج شنبه 02 آبان 1392, 23:43 عصر
یک مشکل دیگه که بین خیلی از دانشجوهای کم تجربه ام شایع بوده، اینه که صفحه فرم و مقصد فرم یکیه و پردازش فرم رو هم بعد از تولید خود فرم مینویسن و درنتیجه، CAPTCHA دوباره قبل از پردازش فرم نشون داده میشه و سشن جدید میسازه. این رو هم چک کنید شاید مشکل از اینجا باشه.

saeed-71
جمعه 03 آبان 1392, 09:23 صبح
یک مشکل دیگه که بین خیلی از دانشجوهای کم تجربه ام شایع بوده، اینه که صفحه فرم و مقصد فرم یکیه و پردازش فرم رو هم بعد از تولید خود فرم مینویسن و درنتیجه، CAPTCHA دوباره قبل از پردازش فرم نشون داده میشه و سشن جدید میسازه. این رو هم چک کنید شاید مشکل از اینجا باشه.

نه صفحه پردازش check.php هستش و فرم login.php
این نیستش!

saeed-71
جمعه 03 آبان 1392, 09:25 صبح
این تغییر سشن ایدی تاثیر گذار نیست تو این مسئله؟



ini_set('session.use_cookies', '1');ini_set('session.use_only_cookies', '1');ini_set("session.cookie_httponly", 1);ini_set("session.use_trans_sid", 0);session_start();session_regenerate_id(true);

MMSHFE
جمعه 03 آبان 1392, 13:00 عصر
احتمالش کمه ولی با این حال میتونید تست کنید. حذفش کنید ببینید درست میشه یا نه؟

ابوذر محمودی
جمعه 03 آبان 1392, 13:58 عصر
تو دستور if هر دو مقادیرو یا به حروف بزرگ تبدیل کن یا به حروف کوچیک بعد دوباره تست کن.

قبل از اینکه شرط رو بررسی کنی مقدار سشن و مقداری که وارد کردیو چاپ کن و ببین اگه فرق داشت باید به کدت رجوع کنی شاید از زمان تولید کپجا تا پردازش اون دوباره کپجا را فراخوانی کردی.

این رو هم حتماً چک کن ، شاید session_start رو تو صفحه ای که داری مقادیر رو مقایسه میکنی فراخوانی نکردی.

saeed-71
جمعه 03 آبان 1392, 21:19 عصر
من گرفتم سشن ها رو اکو کردم دیدم تو بعضی از زمان ها این سشن کپتج بوجود نمیاد اما بعضی وقتا بوجود میاد!دلیلش چیه؟

rezaonline.net
جمعه 03 آبان 1392, 22:46 عصر
احیانا آدرستون با و بدون www نیست ؟

saeed-71
شنبه 04 آبان 1392, 08:23 صبح
احیانا آدرستون با و بدون www نیست ؟

هم با www میاد بالا هم بدون اون

ابوذر محمودی
شنبه 04 آبان 1392, 08:34 صبح
یا باید با www بیاد یا بدون اون.
اینو به .htaccess اضافه کن دوباره تست کن ، وقتی این خط رو اضافه میکنی اگه کاربر site.com رو بزنه ، به www.site.com میره.


RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

saeed-71
شنبه 04 آبان 1392, 09:24 صبح
اول که اینکار رو کردم درست شد اما بعدش مجددا مثل قبل شد!

saeed-71
شنبه 04 آبان 1392, 11:25 صبح
به مسئول سرور گفتم گفتن
مشکلی در session های سرور نیست
خواهشمند است کد خود را دقیقتر بررسی کنید و همچنین تغییر IP یا ارسال session id از طرف مرورگر را نیز بررسی کنید

من از پارس پک استفاده میکنم

rezaonline.net
شنبه 04 آبان 1392, 11:39 صبح
هم با www میاد بالا هم بدون اون
فقط سایت رو با www ببینی یه sessid ست میشه توی کوکی و وقتی بدون www باشه sessid دیگه .
در عمل دو تا session مختلف خواهی داشت ، پس مشکلت دقیقا همینه .
شما آدرس فایل کپچارو مستقیم نده اینطوری بنویس.

<img src='./captcha.php' />

saeed-71
یک شنبه 05 آبان 1392, 09:31 صبح
اقا اصلا من گرفتم کپچا رو برداشتم بعد تست کردم.دیدم بعد از هر بار لاگین کردن به محض این که به صفحه بعد میرم دوباره سشن نابود میشه و و دوباره باید لاگین کنم!
گیج شدم!قبلا اینجوری نبودش
میشه مشکل از سرور باشه؟؟؟؟؟؟؟؟؟؟؟؟

rezaonline.net
یک شنبه 05 آبان 1392, 21:47 عصر
بهتره کدهای بخش لاگین و auth سایتتون رو اینجا بذارید بررسی کنیم .

saeed-71
دوشنبه 06 آبان 1392, 06:37 صبح
سلام
این مال قیمت چک هستش که بعد ارسال اطلاعات ،اطلاعات رو پردازش و سشن رو ایجاد میکنه



<?php
ob_start();
ini_set('session.use_cookies', '1');ini_set('session.use_only_cookies', '1');ini_set("session.cookie_httponly", 1);ini_set("session.use_trans_sid", 0);
session_start();
session_regenerate_id(true);
require_once('../funcs/config.php');
include_once('jdf.php');

# ٍEscape Function
function EscapeString($value)
{
if(!is_numeric($value)) {
if(get_magic_quotes_gpc()) $value = stripslashes($value);
return mysql_real_escape_string($value);
}
else{
return $value;
}
}

mysql_query("set names utf8");
if( isset($_POST['submit']) && !empty($_POST['submit']) )
{
if( strcmp(strtoupper($_POST['captcha']),$_SESSION['captcha'])!=0 )

{
$_SESSION['cap']="کد امنیتی وارد شده اشتباه میباشد.لطفا تصویر امنیتی را بررسی نمایید و مجددا کد را وارد کنید.";
header("location:../noregister.php");
}
else{
$mobile = EscapeString($_POST["mobile"]);
$mobile = filter_var($mobile, FILTER_SANITIZE_NUMBER_INT);
if(!preg_match('/^09[123]\d{8}$/', $_POST['mobile']))
{
$_SESSION['cap']="شماره موبایل وارد شده صحیح نمیباشد.";
header("location:../noregister.php");
}
else{
$mobile = EscapeString($_POST["mobile"]);
$mobile = filter_var($mobile, FILTER_SANITIZE_NUMBER_INT);
$pas = $_POST['ramz'];
$pas = filter_var($pas, FILTER_SANITIZE_STRING);
$ramz = Sha1($pas);
$ramz = md5($pas);
$result = mysql_query("select * from user where mobile='$mobile' AND ramz='$ramz'");
if(mysql_num_rows($result)== 1)
{
$_SESSION['mobile'] = EscapeString($_POST["mobile"]);
$_SESSION['login'] = true;
header("location:allad.php");
}
else{
$_SESSION['cap']="نام کاربری یا کلمه عبور وارد شده اشتباه میباشد.لطفا کلمه عبور و نام کاربری صحیح را وارد کنید.";
header("location:../noregister.php");
}
}
}
}



************************************************** ******************
اینم اون قسمتی که چک میکنه همچین سشنی وجود داره یا نه (عمل لاگین انجام شده یا نه)
البته اون قسمت اتصالش


<?php
ob_start();
session_start();
session_regenerate_id(true);
if($_SESSION['login']!=true){
header("location:../noregister.php");
exit();
}
require_once('../funcs/config.php');
include_once('jdf.php');


?>