Last active
August 25, 2017 02:47
-
-
Save hanigamal/4439957 to your computer and use it in GitHub Desktop.
Validate Credit Cards
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/perl | |
# | |
# CC-Verify script for Visa, MasterCard, Amex and Novus Cards | |
# Written 29 June 1996 by Spider ([email protected]) | |
# http://w3works.com | |
# http://www.servtech.com/public/spider | |
# | |
# Loosely based on a re-post of original by Melvyn Myers | |
# (initial author unknown) but this revision covers all 13, | |
# 15 and 16 digit cards using the Mod 10 algorithm. | |
############################################################################## | |
# COPYRIGHT NOTICE # | |
# Copyright 1996 Dave Paris (aka Spider) All Rights Reserved. # | |
# # | |
# The Validator may be used and modified free of charge by anyone so long as # | |
# this copyright notice and the comments above remain intact. By using this # | |
# code you agree to indemnify Dave Paris from any liability that might # | |
# arise from it's use. # | |
# # | |
# Selling the code for this program without prior written consent is # | |
# expressly forbidden. In other words, please ask first before you try and # | |
# make money off of my program. # | |
# # | |
# Obtain permission before redistributing this software over the Internet or # | |
# in any other medium. In all cases copyright and header must remain intact.# | |
# This Copyright is in full effect in any country that has International # | |
# Trade Agreements with the United States of America. # | |
############################################################################## | |
# Get the input | |
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); | |
# Split the name-value pairs | |
@pairs = split(/&/, $buffer); | |
foreach $pair (@pairs) | |
{ | |
($name, $value) = split(/=/, $pair); | |
# Un-Webify plus signs and %-encoding | |
$value =~ tr/+/ /; | |
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; | |
# Stop people from using subshells to execute commands | |
# Not a big deal when using sendmail, but very important | |
# when using UCB mail (aka mailx). | |
$value =~ s/~!/ ~!/g; | |
# Uncomment for debugging purposes | |
# print "Setting $name to $value<P>"; | |
$FORM{$name} = $value; | |
if ($value =~ /\<\!--\#(.*)\s+(.*)\s?=\s?(.*)--\>/) { &kill_input; } | |
if ($value =~ /[;><\*`\|]/) { &kill_input; } | |
} | |
print "Content-type: text/html\n\n"; | |
if ($FORM{'payby'} eq "yes") { | |
&no_data unless $FORM{'cardholder'}; | |
&no_data unless $FORM{'cardnumber'}; | |
&no_data unless $FORM{'cardexp'}; | |
&CC_Verify; | |
} else { | |
print "Thanks\n"; | |
# You may choose to place something else here, like calling a printable form subroutine | |
exit; | |
} | |
sub CC_Verify { | |
$cardnumber = $FORM{'cardnumber'}; | |
# Remove any spaces or dashes in card number | |
$cardnumber =~ s/ //g; | |
$cardnumber =~ s/-//g; | |
$length = length($cardnumber); | |
# Make sure that only numbers exist | |
if (!($cardnumber =~ /^[0-9]*$/)) { | |
&invalid_cc; | |
} | |
# Verify correct length for each card type | |
if ($FORM{'cardtype'} eq "visa") { &vlen; } | |
if ($FORM{'cardtype'} eq "mastercard") { &mclen; } | |
if ($FORM{'cardtype'} eq "amex") { &alen; } | |
if ($FORM{'cardtype'} eq "novus") { &nlen; } | |
sub vlen { | |
&invalid_cc unless (($length ==13) || ($length == 16)); | |
} | |
sub mclen { | |
&invalid_cc unless ($length == 16); | |
} | |
sub alen { | |
&invalid_cc unless ($length == 15); | |
} | |
sub nlen { | |
&invalid_cc unless ($length == 16); | |
} | |
# Now Verify via Mod 10 for each one | |
if ($FORM{'cardtype'} eq "visa") { &vver; } | |
if ($FORM{'cardtype'} eq "mastercard") { &ver16; } | |
if ($FORM{'cardtype'} eq "amex") { &ver15; } | |
if ($FORM{'cardtype'} eq "novus") { &ver16; } | |
# pick one for Visa | |
sub vver { | |
if ($length == 13) { &ver13; } | |
if ($length == 16) { &ver16; } | |
} | |
# For 13 digit cards | |
sub ver13 { | |
$cc0 = substr($cardnumber,0,1); | |
$cc1 = substr($cardnumber,1,1); | |
$cc2 = substr($cardnumber,2,1); | |
$cc3 = substr($cardnumber,3,1); | |
$cc4 = substr($cardnumber,4,1); | |
$cc5 = substr($cardnumber,5,1); | |
$cc6 = substr($cardnumber,6,1); | |
$cc7 = substr($cardnumber,7,1); | |
$cc8 = substr($cardnumber,8,1); | |
$cc9 = substr($cardnumber,9,1); | |
$cc10 = substr($cardnumber,10,1); | |
$cc11 = substr($cardnumber,11,1); | |
$cc12 = substr($cardnumber,12,1); | |
$cc1a = $cc1 * 2; | |
$cc3a = $cc3 * 2; | |
$cc5a = $cc5 * 2; | |
$cc7a = $cc7 * 2; | |
$cc9a = $cc9 * 2; | |
$cc11a = $cc11 * 2; | |
if ($cc1a >= 10) { | |
$cc1b = substr($cc1a,0,1); | |
$cc1c = substr($cc1a,1,1); | |
$cc1 = $cc1b+$cc1c; | |
} else { | |
$cc1 = $cc1a; | |
} | |
if ($cc3a >= 10) { | |
$cc3b = substr($cc3a,0,1); | |
$cc3c = substr($cc3a,1,1); | |
$cc3 = $cc3b+$cc3c; | |
} else { | |
$cc3 = $cc3a; | |
} | |
if ($cc5a >= 10) { | |
$cc5b = substr($cc5a,0,1); | |
$cc5c = substr($cc5a,1,1); | |
$cc5 = $cc5b+$cc5c; | |
} else { | |
$cc5 = $cc5a; | |
} | |
if ($cc7a >= 10) { | |
$cc7b = substr($cc7a,0,1); | |
$cc7c = substr($cc7a,1,1); | |
$cc7 = $cc7b+$cc7c; | |
} else { | |
$cc7 = $cc7a; | |
} | |
if ($cc9a >= 10) { | |
$cc9b = substr($cc9a,0,1); | |
$cc9c = substr($cc9a,1,1); | |
$cc9 = $cc9b+$cc9c; | |
} else { | |
$cc9 = $cc9a; | |
} | |
if ($cc11a >= 10) { | |
$cc11b = substr($cc11a,0,1); | |
$cc11c = substr($cc11a,1,1); | |
$cc11 = $cc11b+$cc11c; | |
} else { | |
$cc11 = $cc11a; | |
} | |
$val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12; | |
if (substr($val,1,1) !=0 ) { | |
&invalid_cc; | |
} | |
} | |
# For 16 digit cards | |
sub ver16 { | |
$cc0 = substr($cardnumber,0,1); | |
$cc1 = substr($cardnumber,1,1); | |
$cc2 = substr($cardnumber,2,1); | |
$cc3 = substr($cardnumber,3,1); | |
$cc4 = substr($cardnumber,4,1); | |
$cc5 = substr($cardnumber,5,1); | |
$cc6 = substr($cardnumber,6,1); | |
$cc7 = substr($cardnumber,7,1); | |
$cc8 = substr($cardnumber,8,1); | |
$cc9 = substr($cardnumber,9,1); | |
$cc10 = substr($cardnumber,10,1); | |
$cc11 = substr($cardnumber,11,1); | |
$cc12 = substr($cardnumber,12,1); | |
$cc13 = substr($cardnumber,13,1); | |
$cc14 = substr($cardnumber,14,1); | |
$cc15 = substr($cardnumber,15,1); | |
$cc0a = $cc0 * 2; | |
$cc2a = $cc2 * 2; | |
$cc4a = $cc4 * 2; | |
$cc6a = $cc6 * 2; | |
$cc8a = $cc8 * 2; | |
$cc10a = $cc10 * 2; | |
$cc12a = $cc12 * 2; | |
$cc14a = $cc14 * 2; | |
if ($cc0a >= 10) { | |
$cc0b = substr($cc0a,0,1); | |
$cc0c = substr($cc0a,1,1); | |
$cc0 = $cc0b+$cc0c; | |
} else { | |
$cc0 = $cc0a; | |
} | |
if ($cc2a >= 10) { | |
$cc2b = substr($cc2a,0,1); | |
$cc2c = substr($cc2a,1,1); | |
$cc2 = $cc2b+$cc2c; | |
} else { | |
$cc2 = $cc2a; | |
} | |
if ($cc4a >= 10) { | |
$cc4b = substr($cc4a,0,1); | |
$cc4c = substr($cc4a,1,1); | |
$cc4 = $cc4b+$cc4c; | |
} else { | |
$cc4 = $cc4a; | |
} | |
if ($cc6a >= 10) { | |
$cc6b = substr($cc6a,0,1); | |
$cc6c = substr($cc6a,1,1); | |
$cc6 = $cc6b+$cc6c; | |
} else { | |
$cc6 = $cc6a; | |
} | |
if ($cc8a >= 10) { | |
$cc8b = substr($cc8a,0,1); | |
$cc8c = substr($cc8a,1,1); | |
$cc8 = $cc8b+$cc8c; | |
} else { | |
$cc8 = $cc8a; | |
} | |
if ($cc10a >= 10) { | |
$cc10b = substr($cc10a,0,1); | |
$cc10c = substr($cc10a,1,1); | |
$cc10 = $cc10b+$cc10c; | |
} else { | |
$cc10 = $cc10a; | |
} | |
if ($cc12a >= 10) { | |
$cc12b = substr($cc12a,0,1); | |
$cc12c = substr($cc12a,1,1); | |
$cc12 = $cc12b+$cc12c; | |
} else { | |
$cc12 = $cc12a; | |
} | |
if ($cc14a >= 10) { | |
$cc14b = substr($cc14a,0,1); | |
$cc14c = substr($cc14a,1,1); | |
$cc14 = $cc14b+$cc14c; | |
} else { | |
$cc14 = $cc14a; | |
} | |
$val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12+$cc13+$cc14+$cc15; | |
if (substr($val,1,1) !=0 ) { | |
&invalid_cc; | |
} | |
} | |
# For 15 digit (Amex) cards | |
sub ver15 { | |
$cc0 = substr($cardnumber,0,1); | |
$cc1 = substr($cardnumber,1,1); | |
$cc2 = substr($cardnumber,2,1); | |
$cc3 = substr($cardnumber,3,1); | |
$cc4 = substr($cardnumber,4,1); | |
$cc5 = substr($cardnumber,5,1); | |
$cc6 = substr($cardnumber,6,1); | |
$cc7 = substr($cardnumber,7,1); | |
$cc8 = substr($cardnumber,8,1); | |
$cc9 = substr($cardnumber,9,1); | |
$cc10 = substr($cardnumber,10,1); | |
$cc11 = substr($cardnumber,11,1); | |
$cc12 = substr($cardnumber,12,1); | |
$cc13 = substr($cardnumber,13,1); | |
$cc14 = substr($cardnumber,14,1); | |
$cc1a = $cc1 * 2; | |
$cc3a = $cc3 * 2; | |
$cc5a = $cc5 * 2; | |
$cc7a = $cc7 * 2; | |
$cc9a = $cc9 * 2; | |
$cc11a = $cc11 * 2; | |
$cc13a = $cc13 * 2; | |
if ($cc1a >= 10) { | |
$cc1b = substr($cc1a,0,1); | |
$cc1c = substr($cc1a,1,1); | |
$cc1 = $cc1b+$cc1c; | |
} else { | |
$cc1 = $cc1a; | |
} | |
if ($cc3a >= 10) { | |
$cc3b = substr($cc3a,0,1); | |
$cc3c = substr($cc3a,1,1); | |
$cc3 = $cc3b+$cc3c; | |
} else { | |
$cc3 = $cc3a; | |
} | |
if ($cc5a >= 10) { | |
$cc5b = substr($cc5a,0,1); | |
$cc5c = substr($cc5a,1,1); | |
$cc5 = $cc5b+$cc5c; | |
} else { | |
$cc5 = $cc5a; | |
} | |
if ($cc7a >= 10) { | |
$cc7b = substr($cc7a,0,1); | |
$cc7c = substr($cc7a,1,1); | |
$cc7 = $cc7b+$cc7c; | |
} else { | |
$cc7 = $cc7a; | |
} | |
if ($cc9a >= 10) { | |
$cc9b = substr($cc9a,0,1); | |
$cc9c = substr($cc9a,1,1); | |
$cc9 = $cc9b+$cc9c; | |
} else { | |
$cc9 = $cc9a; | |
} | |
if ($cc11a >= 10) { | |
$cc11b = substr($cc11a,0,1); | |
$cc11c = substr($cc11a,1,1); | |
$cc11 = $cc11b+$cc11c; | |
} else { | |
$cc11 = $cc11a; | |
} | |
if ($cc13a >= 10) { | |
$cc13b = substr($cc13a,0,1); | |
$cc13c = substr($cc13a,1,1); | |
$cc13 = $cc13b+$cc13c; | |
} else { | |
$cc13 = $cc13a; | |
} | |
$val = $cc0+$cc1+$cc2+$cc3+$cc4+$cc5+$cc6+$cc7+$cc8+$cc9+$cc10+$cc11+$cc12+$cc13+$cc14; | |
if (substr($val,1,1) !=0 ) { | |
&invalid_cc; | |
} | |
} | |
} | |
##### | |
# | |
# This Section For Anything Past CC Validation | |
# | |
##### | |
print "Thank You\! Your Card Has Passed Validation. It will now be submitted for Charge Authorization.\n"; | |
exit; | |
sub invalid_cc { | |
print "The Credit Card number you've supplied does not pass verification. Please \n"; | |
print "use your <B>Back</B> button and verify that the number you've entered is correct \n"; | |
print "and contains no additional characters other than spaces or hyphens.\n"; | |
exit; | |
} | |
sub kill_input { | |
print "Content-type: text/html\n\n"; | |
$value = ""; | |
print "<CENTER><H1><FONT COLOR=\"\#FF0000\">CGI Alert</FONT></H1></CENTER>\n"; | |
print "<CENTER><H3>It appears as though you've tried to \n"; | |
print "execute a system command via a SSI tag or shell metacharacter. \n"; | |
print "Please use your <B>Back</B> button, remove the tags or characters and re-submit. \n"; | |
print "Thanks\!</H3></CENTER>\n"; | |
exit; | |
} | |
sub no_data { | |
print "It would seem that you've forgotten to fill in one or more of \n"; | |
print "the required fields. Please use your <B>Back</B> button to \n"; | |
print "do that now. Thanks\!\n"; | |
exit; | |
} | |
==================================================================================================== | |
How to use it | |
<HTML> | |
<FORM ACTION="/cgi-bin/cc_ver.cgi" METHOD=POST> | |
<B>Would you like to pay by Credit Card?</B><BR> | |
<INPUT TYPE=RADIO NAME="payby" VALUE="yes"> <B>Yes</B><BR> | |
<INPUT TYPE=RADIO NAME="payby" VALUE="no"> <B>No</B><BR> | |
<P><B>**</B> If you answered "Yes", please fill in the following... | |
<P> | |
<B>CC Type:</B><BR> | |
<INPUT TYPE=RADIO NAME="cardtype" VALUE="visa"> <B>Visa</B><BR> | |
<INPUT TYPE=RADIO NAME="cardtype" VALUE="mastercard"> <B>MasterCard</B><BR> | |
<INPUT TYPE=RADIO NAME="cardtype" VALUE="amex"> <B>American Express</B><BR> | |
<INPUT TYPE=RADIO NAME="cardtype" VALUE="novus"> <B>Novus (Discover)</B> | |
<P> | |
<INPUT TYPE=TEXT NAME="cardholder" SIZE=30> <B>Cardholder's Name</B><BR> | |
<INPUT TYPE=TEXT NAME="cardnumber" SIZE=20> <B>Card Number</B><BR> | |
<INPUT TYPE=TEXT NAME="cardexp" SIZE=5> <B>Card Expiration Date</B> | |
<P> | |
<INPUT TYPE=SUBMIT VALUE="Check"> <INPUT TYPE=RESET VALUE="Clear/Reset"> | |
</FORM> | |
</HTML> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment