PDA

View Full Version : سوال: چرا سسشن هایی که اسکریپت captcha ایجاد می کنه توی بقیه اسکریپتها قابل بازیابی نیست؟



idocsidocs
چهارشنبه 04 آبان 1390, 13:52 عصر
من سسشن ها رو توی دیتابیس ذخیره می کنم.

توی تصاویر کپچا وقتی سسشن ایجاد شد توی دیتابیس ذخیره می شه ولی از طریق بقیه اسکریپتها نمی تونم این متغیر رو بدست بیارم.

اسم متغیر رو به درستی وارد می کنم.

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

idocsidocs
چهارشنبه 04 آبان 1390, 13:55 عصر
من به این شکل تصویر کپچا رو نشون می دم:

<img src="captcha.php" />

لطفا راهنمایی کنید.

MMSHFE
پنج شنبه 05 آبان 1390, 16:27 عصر
با سلام، اگه ميشه كد captcha.php رو بگذارين تا بررسي كنيم. ضمناً توي كد بررسي كنيد ببينيد از كلاس SSSH يك شئ ايجاد شده يا نه؟ اگه اينطور نباشه اين Session توي ديتابيس ايجاد نخواهد شد. درنتيجه از اونجا كه در بقيه كدها از اون كلاس يك شئ ميسازين، فقط Sessionهاي موجود در ديتابيس بازيابي ميشن. موفق باشيد.

idocsidocs
پنج شنبه 05 آبان 1390, 17:40 عصر
کد هایی که توی کلاس کپچا استفاده می کنم رو در ادامه قرار دادم.

هیچ مشکلی توی کپچا و ذخیره سسشن هایی که توی کپچا ایجاد می شن وجود نداره و سسشن ها بخوبی توی دیتابیس ذخیره می شن. مشکل اینجاست که وقتی سسشن های اسکریپت کپچا توی دیتابیس ذخیره می شن، بقیه سسشن ها به کلی پاک می شن.

<?php
class captch_file
{
private $font;
private $width;
private $height;
private $characters;
function __construct()
{
define('ROOT',dirname(__FILE__));
define('DS',DIRECTORY_SEPARATOR);

define('SES_PANEL','yes');
define('SES_INC','yes');

require_once('config.php');
require_once('mysessions.php');
$this->db = new mysqli(IHOST,IUSER,IPASS,IDATABASE) or die ("امکان انجام درخواست شما وجود ندارد، لطفا مجددا تلاش کنيد");
$this->db->set_charset('UTF8');
$session=new MySessionHandler(IHOST,IUSER,IPASS,IDATABASE,$this->db);

session_start();

$this->font='RosewoodStd-Regular.otf';

$this->width = isset($_GET['width']) && $_GET['width'] < 600 ? $_GET['width'] : '145';
$this->height = isset($_GET['height']) && $_GET['height'] < 200 ? $_GET['height'] : '40';
$this->characters = isset($_GET['characters']) && $_GET['characters'] > 2 ? $_GET['characters'] : '6';
}
private function generateCode($charsnum)
{
/* list all possible characters, similar looking characters and vowels have been removed */
$possible = '23456789bcdfghjkmnpqrstvwxyz';
$code = '';
$i = 0;
while ($i < $charsnum)
{
$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
$i++;
}
return $code;
}
private function CaptchaSecurityImages()
{
$code = $this->generateCode($this->characters);
/* font size will be 75% of the image height */
$font_size = $this->height * 0.70;
$image = imagecreate($this->width, $this->height) or die('Cannot initialize new GD image stream');
/* set the colours */

$background_color = imagecolorallocate($image, 255, 255, 255);
$text_color = imagecolorallocate($image, 20, 40, 100);
$noise_color = imagecolorallocate($image, 100, 120, 180);

$textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
$x = ($this->width - $textbox[4])/2;
$y = ($this->height - $textbox[5])/2;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
$_SESSION[mycaptcha_code]="$code";
/* output captcha image to browser */
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
}
public function runcaptcha()
{
$this->CaptchaSecurityImages();
}
}

$captcha = new captch_file();
$captcha->runcaptcha();
?>

Hooman.Prog
پنج شنبه 05 آبان 1390, 23:37 عصر
$_SESSION[mycaptcha_code]="$code";
احتمالا نباید عبارت mycaptcha_code رو داخل کوتیشین بذاری؟

idocsidocs
پنج شنبه 05 آبان 1390, 23:59 عصر
احتمالا نباید عبارت mycaptcha_code رو داخل کوتیشین بذاری؟
انواع و اقسام این روشها رو بکار بردم ولی فایده نداشتن.

idocsidocs
دوشنبه 16 آبان 1390, 03:16 صبح
به هرحل مجبور شدم که توی اسکریپت کپچا، قبل از ایجاد سسشن ها، به دیتابیس وصل بشم، سسشنهای قبلی رو بخونم و سسشن اسکریپت جدید رو به اونها اضافه کنم و بعد مجددا رشته جدید که در واقع همون سسشن ها هست رو توی دیتابیس ذخیره کنم.

با این ترفند مشکلم رو به صورت موقت حل کردم ولی دنبال یه راه استاندارد و اصولی میگردم که خود پی اچ پی این کارها رو بکنه.

لطفا راهنمایی کنید.