PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : تابع چک کردن کارت اعتباری و بانکی



omid1991
September 13th, 2018, 12:11
سلام و عرض ادب خدمت بازدیدکنندگان محترم

شاید بسیار برایتان پیش آمده باشد که در پروژه ای لازم هست که شماره کارت بانکی کاربر را دریافت کنید
و شاید تا الان تنها اعتبارسنجی که انجام میدادید چک کردن 16رقمی بودن و فقط عدد بودن کارت بانکی بوده
بنا به دلایلی لازم شد که واقعا صحت کارت بانکی کاربر را بوسیله الگوریتمی تشخیص دهیم
خب بریم سراغ بررسی ساختار کارت های اعتباری و بانکی

شماره روی کارت های اعتباری یا کارت های بانکی شماره ای است 16 رقمی که از سمت چپ رقم اول بیانگر نوع یا کاربرد کارت (برای کارت های بانکی و اعتباری این رقم می تواند 4 یا 5 یا 6 باشد ) و 5 رقم بعدی بیانگر شماره شناسایی صادر کننده کارت و ارقام 7 تا 15 بیانگر شماره حساب یا شماره منحصر به فرد در مرکز صادرکننده کارت و رقم آخر آن هم یک رقم کنترل است که از روی 15 رقم سمت چپ بدست می آید. برای بررسی کنترل کد کافی است مجدد از روی 15 رقم سمت چپ صحت رقم کنترل را محاسبه کنیم

برای محاسبه رقم کنترل از روی سایر ارقام ، از سمت چپ و با شروع از موقعیت 1 تا موقعیت 16 ، ارقام موقعیت فرد را در 2 و ارقام موقعیت زوج را در یک ضرب می کنیم، اگر حاصل ضرب هر مرحله بیشتر از 9 شد 9 واحد از آن کم کنید تا یک رقمی شود و سپس اعداد حاصل را با هم جمع می کنیم.
اگر عدد حاصل از اجرای مرحله یک بر 10 بخش پذیر باشد ، شماره کارت صحیح قلمداد می شود در غیر اینصورت شماره کارت صحیح نمی باشد

منبع توضیحات ساختار کارت های اعتباری و بانکی : علی آرش (http://www.aliarash.com/article/creditcart/credit-debit-cart.htm)
منبع کد : کارگاه طراحی امیدتک (http://omidtak.ir/post/30)



function bankCardCheck($card='', $irCard=true)
{
$card = (string) preg_replace('/\D/','',$card);
$strlen = strlen($card);
if($irCard==true and $strlen!=16)
return false;
if($irCard!=true and ($strlen<13 or $strlen>19))
return false;
if(!in_array($card[0],[2,4,5,6,9]))
return false;

for($i=0; $i<$strlen; $i++)
{
$res[$i] = $card[$i];
if(($strlen%2)==($i%2))
{
$res[$i] *= 2;
if($res[$i]>9)
$res[$i] -= 9;
}
}
return array_sum($res)%10==0?true:false;
}


$card = '1111222233334444';
if(bankCardCheck($card))
echo 'ok';
else
echo 'err';

rezaonline.net
September 14th, 2018, 10:48
آلگوریتم چک کردن کارت اعتباری ، همون آلگوریتم Luhn هست :65:

function luhn($number)
{
$sum = 0;
$numDigits = strlen($number);
$parity = $numDigits % 2;
for ($i = 0; $i < $numDigits; $i++) {
$digit = substr($number, $i, 1);
if ($parity == ($i % 2))
{
$digit <<= 1;
if (9 < $digit)
{
$digit = $digit - 9;
}
}
$sum += $digit;
}
return (0 == ($sum % 10));
}

omid1991
September 14th, 2018, 13:14
آلگوریتم چک کردن کارت اعتباری ، همون آلگوریتم Luhn هست :65:

function luhn($number)
{
$sum = 0;
$numDigits = strlen($number);
$parity = $numDigits % 2;
for ($i = 0; $i < $numDigits; $i++) {
$digit = substr($number, $i, 1);
if ($parity == ($i % 2))
{
$digit <<= 1;
if (9 < $digit)
{
$digit = $digit - 9;
}
}
$sum += $digit;
}
return (0 == ($sum % 10));
}
جیگرتو بخرم کد من اصلا شبیه به این کد هست ؟!
بعدشم این کد رو تست کن باگ داره کارت بانکی تقلبی هم قبول میکنه :71:
کدی که من نوشتم طبق توضیحات علی آرش و تقریبا بدون باگ هست :53:

T.Toosi
September 14th, 2018, 19:51
جیگرتو بخرم کد من اصلا شبیه به این کد هست ؟!
بعدشم این کد رو تست کن باگ داره کارت بانکی تقلبی هم قبول میکنه :71:
کدی که من نوشتم طبق توضیحات علی آرش و بدون باگ هست :53:

باسلام،

هم در کد شما هم در کد rezaonline.net امکان تقلب وجود دارد به طور مثال در کد شما 6000000000000031 و در کد دیگر 6000000000000000038343434343434343434 درست برگشت میخورد به این دلیل که ساختن عدد در mod 10 کار دشواری نیست.

کدی که قرار دادند همان ارقام موقعیت فرد را در 2 ضرب می کند اما تفاوتی که دارد شامل تمام کردیت کارت ها می شود، به طور مثال visa نوزده و سیزده رقمی هم دارد که باید ارقام موقعیت فرد بر تعداد ارقام % 2 بخش پذیر باشد تا در دو ضرب شود که در نتیجه کد شما جواب نمی دهد. اما کد شما برای کارت ها های داخلی کافی است که جای بهینه تر شدن هم دارد به طور مثال در حلقه اعداد لازم نیست هر بار شرط بررسی بزرگتر از 9 اجرا شود، شما فقط برای ارقام موقعیت فرد بررسی کنید که برای این کار نیاز است لاین بالاتر آن به شکل دیگر نوشته شود.

همچنین فکر کنم بانک ملت رقم اول 9 و بانک توسعه صادرات رقم اول 2 هم دارند که باید تحقیق کنید و اگر همچین چیزی هست به پیش شماره ها اضافه کنید تا کد کامل شود.

omid1991
September 14th, 2018, 20:36
باسلام،

هم در کد شما هم در کد rezaonline.net امکان تقلب وجود دارد به طور مثال در کد شما 6000000000000031 و در کد دیگر 6000000000000000038343434343434343434 درست برگشت میخورد به این دلیل که ساختن عدد در mod 10 کار دشواری نیست.

کدی که قرار دادند همان ارقام موقعیت فرد را در 2 ضرب می کند اما تفاوتی که دارد شامل تمام کردیت کارت ها می شود، به طور مثال visa نوزده و سیزده رقمی هم دارد که باید ارقام موقعیت فرد بر تعداد ارقام % 2 بخش پذیر باشد تا در دو ضرب شود که در نتیجه کد شما جواب نمی دهد. اما کد شما برای کارت ها های داخلی کافی است که جای بهینه تر شدن هم دارد به طور مثال در حلقه اعداد لازم نیست هر بار شرط بررسی بزرگتر از 9 اجرا شود، شما فقط برای ارقام موقعیت فرد بررسی کنید که برای این کار نیاز است لاین بالاتر آن به شکل دیگر نوشته شود.

همچنین فکر کنم بانک ملت رقم اول 9 و بانک توسعه صادرات رقم اول 2 هم دارند که باید تحقیق کنید و اگر همچین چیزی هست به پیش شماره ها اضافه کنید تا کد کامل شود.

با سلام و تشکر بابت راهنماییتون :53:

بزودی اصلاح میشه :113:

omid1991
September 14th, 2018, 23:07
باسلام،

هم در کد شما هم در کد rezaonline.net امکان تقلب وجود دارد به طور مثال در کد شما 6000000000000031 و در کد دیگر 6000000000000000038343434343434343434 درست برگشت میخورد به این دلیل که ساختن عدد در mod 10 کار دشواری نیست.

کدی که قرار دادند همان ارقام موقعیت فرد را در 2 ضرب می کند اما تفاوتی که دارد شامل تمام کردیت کارت ها می شود، به طور مثال visa نوزده و سیزده رقمی هم دارد که باید ارقام موقعیت فرد بر تعداد ارقام % 2 بخش پذیر باشد تا در دو ضرب شود که در نتیجه کد شما جواب نمی دهد. اما کد شما برای کارت ها های داخلی کافی است که جای بهینه تر شدن هم دارد به طور مثال در حلقه اعداد لازم نیست هر بار شرط بررسی بزرگتر از 9 اجرا شود، شما فقط برای ارقام موقعیت فرد بررسی کنید که برای این کار نیاز است لاین بالاتر آن به شکل دیگر نوشته شود.

همچنین فکر کنم بانک ملت رقم اول 9 و بانک توسعه صادرات رقم اول 2 هم دارند که باید تحقیق کنید و اگر همچین چیزی هست به پیش شماره ها اضافه کنید تا کد کامل شود.

عزیز من تحقیق کردم بانک ملت تو بعضی از شهرها با شماره 991975 شروع میشه و بانک توسعه صادرات با شماره 207177 شروع میشه

الگورتیم رو تغییر دادم علاوه بر کارت های ایرانی کارت های بانکی بین المللی هم میشه چک کرد

درمورد دور زدن ، برنامه نویسا و هکر ها بله براشون کاری نداره :d