[ÇÖZÜLDÜ] Mysql e md5 ile kayıt edilmiş verinin karşılaştırılıması nasıl.

Başlatan ecarpar, 24 Temmuz 2011 - 23:28:40

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

ecarpar

Bir arkadaş dediki php ile yapıyorsun güzel hoşda bu şifreler doğrudan neyse o olarak gidiyorlar bunu şifreliyorlar bende araştırdım baktım md5 diye bir yöntem buldum ve kullanıcı şifrelerini md5 ile şifreleyip o şekilde dbye kaydettim fakat denediğimde md5 ile kaydetmiş olduğum kullanıcı ile sisteme giriş yapamıyorum normal şekilde üye oluşturduğumda giriş yapılıyor.

ben şu şlekilde kontrole diyorum kullanıcı girişimi


<?php
require_once(
'../MysqlConnection.php');

$host="$MySqlName"// Host name
$username"$MySqlUserName"// Mysql username
$password="$MySqlPass"// Mysql password
$db_name="Yazilar"// Database name
$tbl_name="kullanicilar"// Table name


// Connect to server and select databse.
mysql_connect("$host""$username""$password")or die("cannot connect");
mysql_select_db("$db_name")or die("cannot select DB");

// username and password sent from form
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];

// To protect MySQL injection (more detail about MySQL injection)
$myusername stripslashes($myusername);
$mypassword stripslashes($mypassword);
$myusername mysql_real_escape_string($myusername);
$mypassword mysql_real_escape_string($mypassword);

//kullanıcı bulunuyor 

$sql="SELECT * FROM $tbl_name WHERE KullaniciAdi='$myusername' and Sifre='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row

if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("myusername");
session_register("mypassword");
header("location:login_success.php");
}
else {
echo 
"Wrong Username or Password";
}
?>




querry burası
$sql="SELECT * FROM $tbl_name WHERE KullaniciAdi='$myusername' and Sifre='$mypassword'";
$result=mysql_query($sql);

Nasıl düzenlemeliyimki bunu md5 ile şifrelediğim kullancıı giriş şifresini kontrol edebilsin. ?
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

ersinkandemir


<?php
$mypassword
=md5($mypassword);
?>


Sorgudan hemen önce bu satırları ekleyin, md5 hâliyle veritabanındaki md5 ile şifrelenmiş veri eşleşirse doğru değeri döner.
Where there's a shell, there's a way.



ecarpar

$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);

$mypassword=md5($mypassword);



$sql="SELECT * FROM $tbl_name WHERE KullaniciAdi='$myusername' and Sifre='$mypassword'";
$result=mysql_query($sql);

yaptım fakat olmadı.
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

cxerpw57

Debuging yaparak sorunu çözebilirsiniz, en son oluşan sql cümleciğini echo ile yazdırıp, çıkan sonucu mysql yönetim aracınız ne ise (phpmyadmin, heidisql) orda koşarmısınız, muhtelemen sql ile ilgili bir sorun vardır, eğer oyle ise sytax'ınıza dikkat etmenizi öneririm.

Yarım hazırlıkla, yarım tedbirle yapılacak taarruz, hiç taarruz etmemekten çok daha fenadır (1922). M.Kemal ATATÜRK
http://canerblt.wordpress.com
twitter : cabulut

canosayan

@ersin
username'i neden md5ten geçirdiniz ki?

olayın özü şu. md5 tek yönlü bir algoritma.bu yüzden geçirdiğiniz değerleri geri döndürülemez. (aslında büyük online databaseler var. 5-6 haneli bir şifrenin md5 i çok rahat buralarda bulunabiliyor.)

mantığınız şu olmalı. kullanıcı adını kaydet. şifreyi md5 ile kaydet. Haliyle şifreyi md5 ile kaydettiğinzde de sorgularken md5 ile sorgulayacaksınız. örneğin sorgunuz
'SELECT * FROM $tbl_name WHERE KullaniciAdi="'.$myusername.'" and Sifre="'.md5($mypassword).'"'; Böylece verileri md5 il tutacaksınız ve hiç bir zaman açık hali işinize yaramayacak.

Tabi yukarıda dediğim nedenlerde ötürü md5 çok güvenilir değil. en kötü ihtimal brute force ile kırılabilir. bu noktada kolay bir yol metinlerin uzamasını sağlamaktır. Örneğin eğer değişmediyse smf şöyle yapar.

1- kullanıcı adını ve şifreyi küçük harfe çevir.
2- şifreyi kullanıcı adınbın arkasına ekle
3- yeni metni sha1 ile kodla.

sizde böyle bir yola gidebilirsiniz. bu brute force ile çözülmesini zorlaştırır.

Chmod bizim işimiz.

ecarpar

canosayan ozaman md5 ile şifreleri kaydetmenin pekde bir mantığı yok desene, de ben niye çözemiyorumb u sorunu onu anlamış değilim,
Alıntı yapılan: cxerpw57 - 25 Temmuz 2011 - 00:25:59
Debuging yaparak sorunu çözebilirsiniz, en son oluşan sql cümleciğini echo ile yazdırıp, çıkan sonucu mysql yönetim aracınız ne ise (phpmyadmin, heidisql) orda koşarmısınız, muhtelemen sql ile ilgili bir sorun vardır, eğer oyle ise sytax'ınıza dikkat etmenizi öneririm.


Sorunu görebilen varmı ?

<?
session_start();
if(!session_is_registered(myusername)){
header("location:main_login.php");
include ("LoginOlamadi.php");
}
?>
<table width="300" border="0" align="center" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<form name="form1" method="post" >
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td colspan="3"><strong>Yeni Kullanıcı Ekleme </strong></td>
</tr>
<tr>
<td width="78">Ad</td>
<td width="6">:</td>
<td width="294"><input name="yeniKullanicininGercekAdi" type="text" id="yeniKullanicininGercekAdi"></td>
</tr>
<tr>
<td>K. Adı</td>
<td>:</td>
<td><input name="yeniKullanici" type="text" id="yeniKullanici"></td>
</tr>
<tr>
<td>Mail</td>
<td>&nbsp;</td>
<td><input name="yeniKullaniciSifresi" type="text" id="yeniKullaniciSifresi"></td>
</tr>
<tr>
  <td>Şifre</td>
  <td>&nbsp;</td>
  <td> <input name="yeniKullaniciMail" type="text" id="yeniKullaniciMail"></td>
</tr>
<tr>
  <td>&nbsp;</td>
  <td>&nbsp;</td>
  <td><input type="submit" name="gonder" value="Kullanıcı Ekle"></td>
</tr>
</table>
</td>
</form>
</tr>
</table>


<?
if(isset($_POST['gonder'])) {

  // gelen datalari isle
   echo "ubuntu";




include ("mysqlConnection.php");

mysql_select_db("Yazilar", $baglanti);

$yeniKullaniciAdi = $_POST['yeniKullanici'];
$yeniKullanicininGercekAdi = $_POST['yeniKullanicininGercekAdi'];
$yeniKullaniciSifresi = $_POST['yeniKullaniciSifresi'];
$yeniKullaniciMail = $_POST['yeniKullaniciMail'];
$yeniKullaniciSifresi =  md5($yeniKullaniciSifresi);

$uyeOlustur = mysql_query("INSERT INTO kullanicilar (KullaniciAdi, GercekIsim, Sifre,Mail)
VALUES ('$yeniKullaniciAdi', '$yeniKullanicininGercekAdi', '$yeniKullaniciSifresi ','$yeniKullaniciMail')");
echo "<br />";
echo $yeniKullaniciAdi;echo "<br />";
echo $yeniKullanicininGercekAdi; echo "<br />";
echo $yeniKullaniciSifresi ;echo "<br />";
echo $yeniKullaniciMail ;echo "<br />";
}
?>
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

ersinkandemir

@canosayan,
Pardon pardon, dalgınlığıma gelmiş, özür dilerim. :)
@ecarpar,
Sorguyu değişkene atamışsınız ama sorguyu gerçekleştirmemişsiniz.
Edit: O doğru kullanım olabilir, tam hatırlamıyorum. :)
Where there's a shell, there's a way.



ecarpar

Alıntı yapılan: Ersin Kandemir - 26 Temmuz 2011 - 00:55:36
@canosayan,
Pardon pardon, dalgınlığıma gelmiş, özür dilerim. :)
@ecarpar,
Sorguyu değişkene atamışsınız ama sorguyu gerçekleştirmemişsiniz.
Edit: O doğru kullanım olabilir, tam hatırlamıyorum. :)
sorguyu gerçekleştirmemişimde mysql e veriyi nasıl yolluyor bu arkadaş :) (Yanlış diyorsun demiyorum bu şekilde mysql e veriyiyolluyor bu arkadaş  :o)
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

ersinkandemir


<?php
$uyeOlustur 
mysql_query("INSERT INTO kullanicilar (KullaniciAdi, GercekIsim, Sifre,Mail)
VALUES ('
$yeniKullaniciAdi', '$yeniKullanicininGercekAdi', '$yeniKullaniciSifresi ','$yeniKullaniciMail')");
if(
$uyeOlustur)
    echo 
"Sorgu başarılı".
else
    echo 
"Sorgu başarısız.";
?>


Bu şekilde sorguyu çağırmalısınız galiba.
Where there's a shell, there's a way.



ecarpar

Ersin Kandemir' öncelikle ilgilendiğin için teşekkür ederim, tamam php bilmiyorum fakat başka 1-2 dilde zaten kodlama yapıyuorum, sadece serverside değiller ve yazmış olduğun ifadeyi biraz açıklıyayım

<?php
$uyeOlustur =    mysql_query("INSERT INTO kullanicilar (KullaniciAdi, GercekIsim, Sifre,Mail)
            VALUES ('$yeniKullaniciAdi', '$yeniKullanicininGercekAdi', '$yeniKullaniciSifresi ','$yeniKullaniciMail')");
if($uyeOlustur)
    echo "Sorgu başarılı".
else
    echo "Sorgu başarısız.";
?>

$uyeolustur diye bir mysql_querry oluşturup gerekli bilgileri yolluyorsun ve diyorsunki
eğer işlem olmuş ise ekrana Sorgu Başarılı yazdır.
Değil ise Sorgı başarısız yazdır.
Yani sadece kendine bir geni dönüş bildirimi koyuyorsun mysql_querry ile ilgili bir işlem yapmıyorsun if ile. Yanlış biliyorsam ustalar düzelticektir diye düşünüyorum.
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

ersinkandemir

@ecarpar,
İf kontrolünde değişkendeki sorguyu çalıştıracaktır, sonuca göre True veya False değerlerini döndürür çünkü.
Where there's a shell, there's a way.



ecarpar

Nasıl yani ?
if in içine yazınca o değişken çalışmışmı oluyor ? kafam karıştı şimdi bak iyiden iyiye, yani bir değişkene değer atayınca onu tutup birkerede if içindemi çalıştırmamız gerekli değerin oluşabilmesi için mi ne için yapmam lazım bunu ?
Benim bildiğim değişkene değer atandığı andan itibaren değer artık değişmiştir değişkeni birde çalıştırmaya gerek olmaz, siz diyorsunuzki bu değeri if ile çalıştırıyoruz, doğrumu anlamışmıyım, php bilmediğim için yazıyorum sakın bir yanlış anlaşılma olmasın öyle yada değil' i tartışmak değil amacım çalışmayı anlıyabilmek.

Yok değişkene veriyi atıp if ile kontrol ettiğimiz de true ya da false dönderiyor tamam, ozaman kontrol ettiğimizde false dönmüşse yenidenmi çağırmak gerekli? Üstteki mysql_query' i ?,
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

ersinkandemir

Galiba yanlış biliyorum.

<?php
function Ortalama($ilk$diger){
$sonuc = ($ilk $diger) / 2;
return $sonuc;
}
$sayi1 1;
$sayi2 2;
$degisken Ortalama($sayi1$sayi2);
echo 
$degisken;
?>


Burada "Ortalama" fonksiyonu girilen iki sayının ortalamasını döndürüyor.

$degisken = Ortalama($sayi1, $sayi2);

Burada da fonksiyon çalıştırılıp dönen değer değişkene atanıyor. Değişkene atandıktan sonra if kontrolü şart değil o zaman. Karıştı gerçekten, tam bilgim yok benim de. :) Bilen birinin yorumunu bekleyelim. :)
Where there's a shell, there's a way.



ecarpar

Şİmdi bak saçmalığa  :o


$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
echo $mypassword ."<br>" ;
$mypassword=md5($mypassword);
echo($mypassword)."<br>";
//echo $mypassword;

$sql="SELECT * FROM $tbl_name WHERE KullaniciAdi='$myusername' and Sifre='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row

if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("myusername");
session_register("mypassword");
header("location:login_success.php");
}
else {
echo "Wrong Username or Password <br>";
echo "0a5913c6303483f87fcc2bc7f == ". md5($mypassword);
}


diyorumki bnaa bir echo ver bakalım.
önce $mypassword un md5 lenmemiş halini istiyorum
sonra md5 lenmiş halini
sonra gidip bakıyorum db de ki kaydı koyuyorum echo ya sonrada yeniden $mypassword un md5 çıktısını istiyorum çıkan sonuca bak  >:(


Acil
0a5913c6303483f87fcc2bc7fe06eab9
Wrong Username or Password
0a5913c6303483f87fcc2bc7f == c9bc07cecb71e97000b55ff3b0736a97

yani diyorki
Sen Acil yazdın
bunun md5 i 0a5913c6303483f87fcc2bc7fe06eab9 dir

sonra db deki kayda bakıyorum onu 0a5913c6303483f87fcc2bc7f  olarak kaydetmiş sonra md5 ine baktığımdada c9bc07cecb71e97000b55ff3b0736a97 olduğunu görüyorum,
şimdi mantık kurmaya çalışayım en son md5 te 2 kere şifrelemiş olduğumdan sorun çıktığını düşünüyorum da db ye niye eksik girmiş veriyi onu çözemedim ben ?

Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

alquirel

Muhtemelen veritabanında şifre için tanımladığın alanın uzunluğunu eksik girmişsin.
Yani md5 bilgisinin sınırlı sayıda karakteri sığıyor senin veritabanına.
md5'in ürettiği karakter sayısı sabittir. 32 karakter. Buna göre güncelle şifre alanını.

ecarpar

alanları ne yapmamı önerirsiniz? longtext uygunmudur. varcharın boyutu sınırlı anladığım kadaı ile 50 olamıyor.
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.

alquirel

Varchar'ın 255e kadar yolu var, 255ten sonra bir değer girerseniz kendiliğinden text'e dönüşür.
Md5 her zaman sabit uzunlukta bir değer verir. 32 karakterdir. 32 karakterlik varchar işinizi görür

ecarpar

Yazmayı unutmuşum çok çok pardon, bu sorun çözüldü evet 25 girmişim alanların uzunluklarını. Teşekkür ederim şu an md5 ile şifreleyip girebiliyorum sorunsuzca.
Eşşeğin uzun bir yolculuğa çıkmış olması onun at olarak döneceği anlamına gelmez.