PHP TC Kimlik No Doğrulama

Çalıştığım yerde lazım oldu devletin hali hazırda paralı olarak doğrudan kendi veritabanında sorgulatabileceği devlet hizmeti mevcut önce bunu söylemeliyim, ama sağolsun bir devlet memuru T.C. kimliklerimiz için algoritmayı açıklayarak bir yerde makale halinde bu hizmeti tanıtırken vermişti. Ben de algoritmayı takip ederek bir kontrol sistemi yazabilir miyim dedim ve bir baktım ki yazmışım. Şimdi sizlerle paylaşıyorum, rahat rahat kullanabilirsiniz. Sadece şunu söylemeliyim bu algoritma yalnızca kimlik numarası geçerli bir kimlik numarası mı değil mi diye kontrol etmektedir, yani insanlar rastgele sayı yazdıklarında gerçekten öyle bir kimlik numarası var ise doğru sonuç dönmektedir.

Çok konuştum hemen kodlara geçiyoruz;

index.php
Biraz karışık ve acele oldu, yani css ile çok daha sade bir sayfada çıkabilirdi ancak alışkanlığım değildir :) Hızlı olsun diye hemen en basit şekilde yazdım, işlemci sayfası da öyle.

T.C. Kimlik No Doğrulama Sistemi
<!-- /* #POWERED BY FIRAT KOYUNCU #T.C. Kimlik No Doğrulama Sistemi #Yazar: Firat KOYUNCU #Nick: FK Designer #Twitter Sayfasi: www.twitter.com/fkdesigner #Facebook Sayfasi: www.facebook.com/fkdesigner */ -->
<table width="500" border="1" align="center">
<tbody>
<tr>
<td><form action="kontrol.php" method="post">
<table width="500" border="0" align="center">
<tbody>
<tr>
<td class="baslik" colspan="3" align="center">T.C. KİMLİK NUMARASI KONTROL SİSTEMİ</td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
<tr>
<td class="giris_baslik" width="143">T.C. Kimlik Numarası</td>
<td class="giris_baslik" width="5">:</td>
<td width="338"><label>
<input type="text" name="tc_kimlik_no" size="30" maxlength="11" />
<input type="submit" name="Submit" value="Kontrol Et" />
</label></td>
</tr>
<tr>
<td colspan="3"></td>
</tr>
</tbody>
</table>
</form></td>
</tr>
</tbody>
</table>

Şimdi ne yaptık sadece içinde form bulunan bir php sayfası yazdık o kadar, bu bir html sayfası da olabilir ben php’yi çok seviyorum o yüzden php yaptım mesele size kalmış. Bu formun tek özelliği post metoduyla kontrol.php sayfasına tc_kimlik_no adlı bir input yollaması.

Gelelim şimdi kontrol.php sayfamıza heyecan işte burada başlıyor :)
kontrol.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=iso-8859-9" />
<title>T.C. Kimlik No Doğrulama Sistemi</title>
</head>
<body>
<?php
/*
#POWERED BY FIRAT KOYUNCU
#T.C. Kimlik No Doğrulama Sistemi
#Yazar: Firat KOYUNCU
#Nick: FK Designer
#Twitter Sayfasi: www.twitter.com/fkdesigner
*/

//T.C. Kimlik numarasını alıyoruz ve değişkene atıyoruz;
$tc_kimlik_no = $_POST['tc_kimlik_no'];
//Sadece sayı girildiğinden emin oluyoruz;
if (eregi ("^[0-9]{1,}$", $tc_kimlik_no, $tc_kimlik_no)){
$tc_kimlik_no = $tc_kimlik_no[0];
}
else {
echo "<b><font face='verdana' size='2' color='red'>Geçerli Bir Kimlik Numarası Değil !</font></b><br><br>";
echo "<font face='verdana' size='1'><a href='index.php' style='text-decoration:none;'> << geri </a></font>";
exit;
}
//11 karakter girildiğinden emin oluyoruz;
$karakter = strlen($tc_kimlik_no);
if ($karakter==11){
}
else{
echo "<b><font face='verdana' size='2' color='red'>Geçerli Bir Kimlik Numarası Değil !</font></b><br><br>";
echo "<font face='verdana' size='1'><a href='index.php' style='text-decoration:none;'> << geri </a></font>";
exit;
}
#T.C. KİMLİK ALGORİTMA BAŞLANGICI;
//İlk hane 0 olamaz;
if ($tc_kimlik_no[0]==0){
echo "<b><font face='verdana' size='2' color='red'>Geçerli Bir Kimlik Numarası Değil !</font></b><br><br>";
echo "<font face='verdana' size='1'><a href='index.php' style='text-decoration:none;'> << geri </a></font>";
exit;
}
else{
}
//1,3,5,7 ve 9 hanelerin toplamının 7 katından; 2,4,6 ve 8. hanelerin toplamı çıkartıldığında, elde edilen sonucun 10'a bölümünden kalan, bize 10. haneyi verir.
$toplam_1 = $tc_kimlik_no[0] + $tc_kimlik_no[2] + $tc_kimlik_no[4] + $tc_kimlik_no[6] + $tc_kimlik_no[8]; $toplam_1 = $toplam_1 * 7; $toplam_2 = $tc_kimlik_no[1] + $tc_kimlik_no[3] + $tc_kimlik_no[5] + $tc_kimlik_no[7]; $sonuc = $toplam_1 - $toplam_2;
$sonuc = fmod($sonuc, 10);
if ($sonuc == $tc_kimlik_no[9]){
}
else{
echo "<b><font face='verdana' size='2' color='red'>Geçerli Bir Kimlik Numarası Değil !</font></b><br><br>";
echo "<font face='verdana' size='1'><a href='index.php' style='text-decoration:none;'> << geri </a></font>";
exit;
}
//1,2,3,4,5,6,7,8,9. ve 10. hanelerin toplamından elde edilen sonucun 10'a bölümünden kalan, 11. haneyi verir. $son_toplam = $tc_kimlik_no[0] + $tc_kimlik_no[1] + $tc_kimlik_no[2] + $tc_kimlik_no[3] + $tc_kimlik_no[4] + $tc_kimlik_no[5] + $tc_kimlik_no[6] + $tc_kimlik_no[7] + $tc_kimlik_no[8] + $tc_kimlik_no[9];
$son_toplam = fmod($son_toplam, 10);
if ($son_toplam == $tc_kimlik_no[10]){
}
else{
echo "<b><font face='verdana' size='2' color='red'>Geçerli Bir Kimlik Numarası Değil !</font></b><br><br>";
echo "<font face='verdana' size='1'><a href='index.php' style='text-decoration:none;'> << geri </a></font>";
exit;
}
echo "<b><font face='verdana' size='2' color='green'>Kimlik Numarası Geçerli</font></b>";
echo "<font face='verdana' size='1'><a href='index.php' style='text-decoration:none;'> << geri </a></font>";
?>
</body>
</html>

Şimdi ne yaptık hemen özetleyeyim, kimlik algoritmamız belli adım adım gittik her açıklama satırını tek tek ayrıntısıyla açıklayayım;  ilk başta aldığımız T.C. kimlik numarasını bir değişkene atadık, daha sonra regular expression (düzenli ifade) yazarak girilen değerin sadece sayı olup olmadığını sorguladık.

Basit olması açısından if-else üzerinden gittim ve sağlanmayan şartlarda exit ile işleyişi durdurdum. Yoksa yazmanın tabiki de binbir çeşit yolu var en basitinden while döngüsü içine koyup tek seferde tüm şartları sorgulatabilirdik ama ben öyle yapmak istemedim. Yine eregi mi kaldı artık demeyiniz :) Çünkü şu anda çalıştığım yerde daha çok ASP ile çalışmak durumundayız haliyle PHP’den biraz uzak kaldım en yeni versiyonu yazmamı beklemeyin ama eskisi her zaman iyidir.

Geçelim şimdi sayı ise devam ettik, strlen fonksiyonu ile kaç karakter içerdiğine baktık ve tam 11 karakter ise devam ettik değilse hata verdirdik. T.C. Kimlik numaraları 11 karakterdir bildiğimiz gibi.

Şimdi değişkenimizin [0]. elemanını alarak baktık eğer 0(sıfır) ise hata verdirdik. İlk karakter 0(sıfır) rakamı olamaz.

Geriye iki algoritmamız kaldı bunlardan birisi 1,3,5,7 ve 9. karakterleri toplayıp 7 katını bulup daha sonra 2,4,6 ve 8. karakterleri toplayarak bunlardan çıkarmak. Çıkan sonucun 10′a bölümünden kalanı yani mod 10′u bize kimlik numarasının 10. karakterini verecek. Bu şart sağlanıyorsa ilk algoritma doğrudur. Bu algoritma sırasında size tanıdık gelmeyen fmod olabilir o da ilk değerin ikinci değere göre modunun alınması işlemini gerçekleştirir.

Ve geldik ikinci algoritmamıza bu ise şöyle 1,2,3,4,5,6,7,8,9 ve 10. karakterleri topluyoruz ve çıkan sonucu yine 10′a bölüyoruz bölme işleminde kalan bize kimlik numaramızın 11. basamağını veriyor. Evet bu şart da sağlandıysa kimlik numarası geçerli olmuş oluyor.

Tabiki böyle bir algoritmanın resmi kanıtı (en iyi kanıt kendi kimlik numaranızın bu algoritmayı sağlıyor olması :) ) yok ancak  sayın Akif AKINCI sağolsun devletin sorgulama yapan hizmetini anlatırken makalesinde bu algoritmaya da değinmiş algoritmayı alıp PHP’ye tamamen ben yazdım kodlardan bellidir zaten :) Sanıyorum ki bu bir ilk neden çünkü Google amcama sordum o da ben bilmem dedi :) Lafı fazla uzattığıma inanıyorum umarım işinize yarar hepinize teşekkürler sabrınız için :)

Bu yazı toplam 650 kere görüntülenmiştir.

0saves
Eğer yazıyı beğendiyseniz lütfen yorum bırakın veya diğer yazılardan haberdar olmak için RSS'e üye olun..

İlgili Yazılar:

Yazar Hakkında


Yazar:

Hakkında / İlgi Alanları: Fırat Koyuncu, web hastası bir insanım. Web demek yetersiz aslında bilişim hastası bir insanım. www.twitter.com/fkdesigner ve www.facebook.com/fkdesigner olarak sosyal medyada da takip edebilirsiniz aranızda bilişimciler varsa bilişim üzerine konuşmak, yeni projeler üretmek, takım çalışması yapmak acayip hoşuma giden şeyler arasındadır. Ve açık kaynağı aşırı bir şekilde desteklemekteyim.
Kategori: PHP, August 5th, 2011

Yazarlarımızdan , bu yazı dahil toplam 2 adet yazı yazmış.

4 yanıt

  • Makale güzel ve amacı olanlara uygun, ancak ismimin geçtiği bölümdeki imla hatası mana olarak başta düşündürücü, sanki çalıntı bir makale yayınlamışım gibi…:-) Ve kendi sitemizede bir yorum kabul edebilirdik sahsinizdan ilgili makaleye istinaden…
    Bol kodlamalar…

  • FK Designer says:

    Hocam bulup yorum yazmanıza çok sevindim, ben o gün kafam dağınık iken okuyup geçtim ve kopyalamakla yetindim yazınızı kendi bilgisayarıma. Daha sonra makalenin başında bakarsanız isminiz geçmiyor hatırlayamadım çünkü sonra aradım baktım kopyaladığım yerde yazıyordu da en sona yazabildim kafanızda bir şüphe olmasın kesinlikle. Siteyi de arayıp bulamamıştım tekrardan ama elbette şimdi yorumunuzda gördüğüm için eksik olan yorumumu da tamamlayacağım. Sağolun varolun, tekrar teşekkürler algoritma ve yorumunuz için :)

  • Tebrik ederim güzel bir makale olmuş işime yaradı.

  • FK Designer says:

    Teşekkür ederim, geri dönüşünüz beni mutlu etti.



Cevap yaz