PDA

View Full Version : مشکل در ساخت captcha



one hacker alone
پنج شنبه 10 اسفند 1391, 02:31 صبح
با یاد خدا
سلام دوستان
من در ساخت کد امنیتی به مشکل بر خوردم
اول خودم خواستم بسازم با خطای زیر مواجه شدم
بعد کدهای یکی دو تا کتاب رو تست کردم
و همچنین کدهای تو نت رو اما همشون رو سیستم من خطای زیر رو میزنن

"cannot be displayed because it contains errors"

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


header('Content-type: image/png');
$md5 = md5(microtime() * time() );
$string = substr($md5, -5);
$captcha = imagecreatefrompng("./capcha.png");
$black = imagecolorallocate($captcha, 0, 0, 0);
$line = imagecolorallocate($captcha,233,239,239);
imageline($captcha,0,0,39,29,$line);
imageline($captcha,40,0,64,29,$line);
$_SESSION['key'] = md5($string);
imagestring($captcha, 5, 20, 10, $string, $black);
imagepng($captcha);




$h=100;
$w=300;
$im=imagecreate($w,$h);
$bc=imagecolorallocate($im,200,200,200);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);


درضمن تو فایل html هم من از تگ img استفاده کردم و ادرس فایل رو همین کدهای php زدم نشد

2undercover
پنج شنبه 10 اسفند 1391, 07:12 صبح
احتمالا کتاب خانه GD شما غیر فعال هستش و باید فعالش بکنین!

توی فایل php.ini می تونید این کارو انجام بدید!

با برداشتن کاراکتر ";" از اول این عبارت توی php.ini:

extension=php_gd2.dll

MMSHFE
پنج شنبه 10 اسفند 1391, 11:05 صبح
بعلاوه چون مستقیماً تصویر ساخته شده با GD رو میفرستین، باید فایلهاتون رو با کدگذاری UTF-8 without BOM ذخیره کنید و اولشون ob_start و آخرشون هم ob_end_flush رو صدا بزنید تا BOM برای مرورگر ارسال نشه. برای اطمینان، یکبار دستور header رو حذف کنید ببینید مرورگر چی نشون میده و خطای تولیدشده چیه و بعد از اطمینان از اینکه خطایی وجود نداره (یه مشت کارکتر عجیب و غریب باید ببینید)، اونوقت header رو بگذارین تا خروجی رو تبدیل به فرمت تصویر کنه.

one hacker alone
پنج شنبه 10 اسفند 1391, 11:25 صبح
ببینید ما دو فایل داریم یکی 1.php یکی هم 2.htm
حالا باید فایل 2 رو کد گذاری کنم با UTF-8 without BOM و
فایل 1 رو در ابتدا و انتهای برنامه اون دو تابع رو فراخوانی کنم؟
البته این رو هم بگم که قبل از این موضوع من وقتی header('Content-type: image/png'); رو دستکاری میکردم گاهی خروجی به شکل زیر میشد


�PNG  IHDR�9$�W �IDATx����O]��܇N�)��* BX��"�[�Ę`\�p��'.��\�/�e�D�I ^"BR���tڹ�����I��y|z�i�w> �=�������e��y����[@��IM��� %5A HM�R���)�+�}��q����çO ��-� Cv�O�^��(* CI����������� �µk׆-��ё DQ �� �a����`��d�(J�mQ�a� a���I ��e �P���ak9�t�0 c۶aAd��s��%-�+L�4M3 C�4���L��Jp��U�a<�SUu?iM�rrr���GGGE��3I��� �E���h4�����{{{�jU�e� �����I:��/_�, �0@&�IRRwH�dY�pbbb���z���팽ѩ �aP�a������/^LNV����0 �q$I��߿�4��j �����^��H����r9�4��u ����du����ׯ_u]�ԍF���V�uxx������3`1 ]ڸP(pGӴ뺍F#!M]E��84Mx^˲��qܶmM������� ���e�B�`~~�V��8~xxxpp�j�._ ����N�`rr��l��� y��)`kkK�4���i��,  �X�- ��3ݙp����/_�;w�� ���!�fS�$]�s�ܰR�KKK�r�,�2I�4M�����/�b�ݖ$)���E�$A��N �={��s����u�d2�ߏ��� ����ׯEbrr���(�<�s]ײ,��ǩ�j�癦�l6UU�}?��Q�� �J��iB�8���A�X�WS���� ����Pј�����(�P���~6 %�u]]�!��Zmff�O+��h��,� � )\�u��h��˲lE����9L}��� ���ܜ��E��j�v���d2�,s7 11����������� I� �.\�}�v���UU+����>��ɓ'��[677 �@�4M[�Ų���$���������q%�E ۶��H�$�b|��� ���A9oo,//������� p]�$IY��}�FӴ���bq��D�&X\\4M�q��\íV��FCUU� r�� ���������/_��r9�0\ץ(���z��l6)����J �wE�0LQ����Ñ����� z��ŋ��q��=�S�aY�wvv��� ��G�e����j��y�PQ��,h( OEA�MT������r9�u]�mE��F�������$ї $I�i��qi�=�,��yQoݺ5�I� ����nE�m���iZB��FGG� o�9��q��>|���˗X4��$ѡzXI�$X^^�{���� �Ӓ$��0���[[[�z=��{�����ܻw���0�a� a}o*�����aA�t�WA���� ��m; C��� ���$I������������� w� �m'��4�4� x�_YYIh��3>>>33���.�"�0��X��8���O�י��L�0 �0�FrU�z��j��`Yv�e����ٳ ��-UU����.]���� meevddDӴX���Z�vtt�y^&��y�fB��Q,--���p�����g�R������ I\�ijnܸ���.�r�������# ����j&����i��Lfww��n��̔J%�a�� z�P�f���A`�6I�������� ��<��<�(J��R��}��<�Cvvv&''Y�-�J�㜞���͡?A`�f6������ �|���~���0 4�$Ia���a��c��L�8�4M��� H��j5�0DQt]�ѣG��j5Ƒ��j�ZE�ŝ?kyyu��� �8���4�V���,K�e� C�Hd�eQ����n۶�#S���,�2 ���4M��pF�$:��x׮][]]-�J� @���Q!�O�\ nܸ���k˲,�B�|6��ed�i�Qq�U �u���i۶Qח�y�\NT�����V+ Q��Qmş贋>���f�Y�� ��B���(�A@�p�iZ&�)�J�v�X,BQ�-vЪ���!|��q��i� �z틒$����k�'�mg�Y�4��h� \�"��`��.]�,?x��A\C�l���E˲L��<���Ϫ��߉Z�T�}���x�X�6� �Z�������ׯAP��1 �$���t�;�FQ�;S�%���Y]]eY5���mll�3I�4M�x��:��v ����iUU]�u��7O�4Y�Q�E\�R~&),..��2M�w���g(��EQ�,+�� H��XnE�L��9����_9�l� TŶ�J�2l-'g���� ð�j�Z�ak�;�������3��$M j���)� R@j��� �&H� R�����g�IEND�B`�

MMSHFE
پنج شنبه 10 اسفند 1391, 11:40 صبح
فایل 2 که داره عکس رو نشون میده بهش کاری نداریم. فایل 1 باید هم UTF-8 without BOM باشه و هم ob_start در ابتدا و ob_end_flush در انتهاش صدا زده بشه.
موفق باشید.

one hacker alone
پنج شنبه 10 اسفند 1391, 17:38 عصر
مشکل حل نشد
فکر کنم کار من اشتباه باشه
ببینید من اومدم تو فایل 1.php کد زیر رو نوشتم


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 without BOM" />
<title>Untitled Document</title>
</head>
<body>
<?php
ob_start();
Header('Content-type: image/png');
$im=ImageCreateFromPNG('capcha.png');
ImagePng($im);
ob_end_flush();
?>
</body>
</html>


تو فایل اول هم در تگ img ادرس عکس رو فایل 1.php قرار دادم
خروجی با دستکاری header با به شکل همون حروف نا مشخص میشه یا مثل عکسی که نمیتونه لود بشه به شکل زیر
100680
یه سوال دیگه اینکه ایا عکس باید با اجرای 1.php هم اجرا بشه یا اینکه از فایل 2.html استفاده بشه
من در کد بالا فقط عکس رو که قبلا داشتم لود کردم و خواستم اون نمایش داده بشه بدون هیچ دستکاری

2undercover
پنج شنبه 10 اسفند 1391, 18:05 عصر
1. ob_start رو در ابتدای صفحه قبل از اینکه حتی تگ html رو باز کرده باشید فراخوانی کنید!

2. توی فایل PHP تون نباید کد html داشته باشید! پس همه ی اون کد های html رو از صفحه ی 1.php پاک کنید!

:چشمک:

one hacker alone
پنج شنبه 10 اسفند 1391, 18:52 عصر
خب وقتی تگ های html رو پاک کنم اون تابع ob_start خود به خود در خط اول قرار میگیره نکته بعد اینکه پس این charset=UTF-8 without BOM" رو کجا پیاده سازی کنم؟

siavashsay
پنج شنبه 10 اسفند 1391, 19:23 عصر
مشکل حل نشد
فکر کنم کار من اشتباه باشه
ببینید من اومدم تو فایل 1.php کد زیر رو نوشتم


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8 without BOM" />
<title>Untitled Document</title>
</head>
<body>
<?php
ob_start();
Header('Content-type: image/png');
$im=ImageCreateFromPNG('capcha.png');
ImagePng($im);
ob_end_flush();
?>
</body>
</html>


تو فایل اول هم در تگ img ادرس عکس رو فایل 1.php قرار دادم
خروجی با دستکاری header با به شکل همون حروف نا مشخص میشه یا مثل عکسی که نمیتونه لود بشه به شکل زیر
100680
یه سوال دیگه اینکه ایا عکس باید با اجرای 1.php هم اجرا بشه یا اینکه از فایل 2.html استفاده بشه
من در کد بالا فقط عکس رو که قبلا داشتم لود کردم و خواستم اون نمایش داده بشه بدون هیچ دستکاری
نمیدونم چرا ایجا دارید اجیاد فایل میکنید !
برای نشون دادن فایل عکس باید از تگ img استفاده کنید :

<img src="file_img.php" />

facefeed
پنج شنبه 10 اسفند 1391, 20:03 عصر
خب وقتی تگ های html رو پاک کنم اون تابع ob_start خود به خود در خط اول قرار میگیره نکته بعد اینکه پس این charset=UTF-8 without BOM" رو کجا پیاده سازی کنم؟

سلام ، به نظرم نظر مهندش شهرکی عزیز این بود که شما فایل php رو با یه ادیتور مناسب مثل notepad++ باز کنید و از منوی charset گزینه utf8 without bom رو انتخاب کنید
اگر جواب نداد ، برگردونید به حالت اول، محتوای فایل رو کات کنید ، charset رو روی utf8 without bom تنظیم کنید و محتوای فایل رو paste کنید

one hacker alone
پنج شنبه 10 اسفند 1391, 20:20 عصر
اقا فایلم رو به شکلی که گفتین utf8 without bom کردم و از این لحاظ مطمئن هستم
اما باز جواب نمیده
الان تمام حرف ما سر این فایل php ِ یه دیگه؟ خوب یکی ازدوستان که که میدونه تو سیستمش این کد جواب میده فایلشو اینجا بزاره اگه از اون باشه باید رو سیستم من جواب بده دیگه بعد من خودم میشینم تکلیفشو روشن میکنم اگه از اونم کار نکرد دیگه وقتمو رو این فایل نزارم چوون من الان موندم مشکل از کجاس
کتابخانه gd2 هم فعال هست

one hacker alone
جمعه 11 اسفند 1391, 06:27 صبح
دوستان کسی نیست کمک کنه تکلیف این رو روشن کنیم؟

Tarragon
جمعه 11 اسفند 1391, 08:33 صبح
سلام این کد خودتون درست؟

<?php
session_start();
error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);
header('Content-type: image/png');
$md5 = md5(microtime() * time() );
$string = substr($md5, -5);
$captcha = imagecreatefrompng("./captcha.png");
$black = imagecolorallocate($captcha, 0, 0, 0);
$line = imagecolorallocate($captcha,233,239,239);
imagestring($captcha, 5, 20, 10, $string, $black);
$_SESSION['key'] = md5($string);
imagepng($captcha);
imagedestroy($captcha);
?>
اما شما باید یه عکس به نام captcha.png که پیش زمینه کپچا هست رو در کنار عکس داشته باشید.
الان من تست کردم درست شد.

MMSHFE
جمعه 11 اسفند 1391, 09:44 صبح
فایل 2 که کار تولید CAPTCHA رو انجام میده، نباید هیچ کد HTML توش باشه. فقط خروجی ImagePNG باید توی فایل باشه. کدی که آقا امین گذاشتن رو بینید. بعد توی فایل 1 که قراره تصویر تولیدشده توسط فایل 2 رو نشون بده اینطوری عمل کنید:

<img src="2.php"/>

Tarragon
جمعه 11 اسفند 1391, 10:47 صبح
فایل کامل رو از زیر دانلود کنید.
100709

one hacker alone
جمعه 11 اسفند 1391, 14:17 عصر
مشکل حل شد
بابا من فکر میکردم این شکل ادرس دهی ./captcha.php میره از روت میخونه برا همین مثل ادرس دهی های دیگه captcha.php مینوشتم برا همین جواب نمیداد
ممنون از همه گی
در ضمن باید با اجرای هر دو فایل php ,html عکس لود بشه که برای من شد
برنامه بدون اون دو تابع که در ابتدا و انتها باید نوشته میشد کار کرد اما میخوام بدونم کاربردشون چیه؟
و این ادرس دهی چرا به این شکله؟
و اگه من بخوام حروفم کج بشن چکار باید بکنم الان حروفم کنار هم و منظم هست

siavashsay
جمعه 11 اسفند 1391, 14:35 عصر
میتونید از راههای زیادی استفاده کنید !
اما بهترین راه و راحتتری راهش اینه که از فونت های کج و ناخوانا استفاده کنید ! اینطوری خیلی بهتره و راحتتر هست :)

MMSHFE
جمعه 11 اسفند 1391, 14:52 عصر
کد نمونه که من گذاشتم رو ببینید. حروف رو بهم میریزه.

one hacker alone
جمعه 11 اسفند 1391, 17:01 عصر
کدتون رو دیدم اما کپتچای شما ترکیبی از حروف و عدد بود نه کج بودن یا سرو ته بودن کاراکتر ها

MMSHFE
جمعه 11 اسفند 1391, 19:44 عصر
شرمنده نسخه قدیمی رو گذاشته بودم. این جدیده رو چک کنید. نمونه اجراش رو توی این لینک (http://demos.ncis.ir/zahedanrpc/mngmnt/?page=login) میتونید ببینید.