lostyazilim
tr.link

PHP Bilgisine Güvenen Birinin Yardımına İhtiyacım Var

7 Mesajlar 1.097 Okunma
lstbozum
tr.link

brown brown WM Aracı Kullanıcı
  • Üyelik 28.10.2013
  • Yaş/Cinsiyet 25 / E
  • Meslek öğrenci
  • Konum İstanbul Avrupa
  • Ad Soyad H** E**
  • Mesajlar 1748
  • Beğeniler 385 / 385
  • Ticaret 27, (%96)
Arkadaşlar bu tarz bir konu açmam sakıncalı mı bilmiyorum ama daha önce tatmin edici cevap alamadığım 2 sorum hala gündemimi meşgul ediyor. O soruları şu 2 konuda sormuştum;

https://wmaraci.com/forum/php/veritabani-bozuk-karakter-351903.html

https://wmaraci.com/forum/php/session-hatirla-351900.html

Özellikle 2. konudaki session ve beni hatırla ile ilgili konu oldukça sıkıntılı. Bahsettiğim metodu uyguladım ancak hala güvenli ya da sağlıklı olup olmadığı konusunda tereddütteyim.

İşlemi şöyle uyguluyorum;

Eğer kullanıcı beni hatırlaya tıklarsa kullanıcı adı ve giriş yaptığı zamanı birleştirip şifreleyip acces adında bir cookie'de saklıyorum ve aynı şifreyi veri tabanına kaydediyorum. Ardından her sayfanın başına giris_kontrol.php adında bir sayfa çağırıp burada kullanıcının bilgisayarında acces cookie'sindeki şifre ile veritabanındaki şifreleri karşılaştırıyorum ve uyan bilgilerle giriş yaptırıyorum.
 

 

wmaraci
reklam

mashadow mashadow WM Aracı Kullanıcı
  • Üyelik 08.06.2016
  • Yaş/Cinsiyet 33 / E
  • Meslek Yazılımcı
  • Konum Tekirdağ
  • Ad Soyad M** Y**
  • Mesajlar 4
  • Beğeniler 1 / 2
  • Ticaret 0, (%0)
1- Kullanıcı "beni hatırla" seçeneği seçili olarak başarılı bir şekilde login olduktan sonra, bir cookie ayarlayın. Bu cookie kullanıcının kullanıcı adını (elinizdeki key ile decode edilecek şekilde şifrelenmiş) ve çok büyük rasgele bir sayının sha256 ile hashlenmiş halini içersin (buna token diyelim). Bu kullanıcı adı ve token ikisi birlikte bir sql tabloda kayıt altına alınsın.

2- Giriş yapmamış ama cookieye sahip ziyaretçi siteye girdiğinde bu cookieden aldığımız username ve tokenin tabloda var olup olmadığına bakalım. Eğer böyle bir kayıt varsa, bunu geçerli bir oturum sayalım. Tokeni silelim, yeni bir token oluşturup hem cookieye hem tabloya yazalım. Eğer böyle bir kayıt yoksa, dikkate almayalım.

Bu yöntemle farklı bilgisayarlardan veya browserlardan oturum açan aynı kullanıcı her bilgisayarda bu özelliği kullanabilecektir. Bunu istemiyorsanız, kullandığımız tablodaki kullanıcı adı kısmını unique gibi düşünüp sadece tek bir kayıt tutulmasınına izin verirseniz diğer cookieleri geçersiz kılar ve her zaman başarılı olarak son oturum açmış bilgisayar veya browserdan çalışmasını sağlayabilirsiniz.

Ben bu kadarının yeterli olduğu düşünüyorum, banka veya benzeri bir durum için kodlama yapmıyorsanız.

Ayrıca bu işlemi her sayfada yinelemenize gerek yok sadece giriş anında yapsanız yeterli.
 

 

brown brown WM Aracı Kullanıcı
  • Üyelik 28.10.2013
  • Yaş/Cinsiyet 25 / E
  • Meslek öğrenci
  • Konum İstanbul Avrupa
  • Ad Soyad H** E**
  • Mesajlar 1748
  • Beğeniler 385 / 385
  • Ticaret 27, (%96)

mashadow adlı üyeden alıntı

1- Kullanıcı "beni hatırla" seçeneği seçili olarak başarılı bir şekilde login olduktan sonra, bir cookie ayarlayın. Bu cookie kullanıcının kullanıcı adını (elinizdeki key ile decode edilecek şekilde şifrelenmiş) ve çok büyük rasgele bir sayının sha256 ile hashlenmiş halini içersin (buna token diyelim). Bu kullanıcı adı ve token ikisi birlikte bir sql tabloda kayıt altına alınsın.

2- Giriş yapmamış ama cookieye sahip ziyaretçi siteye girdiğinde bu cookieden aldığımız username ve tokenin tabloda var olup olmadığına bakalım. Eğer böyle bir kayıt varsa, bunu geçerli bir oturum sayalım. Tokeni silelim, yeni bir token oluşturup hem cookieye hem tabloya yazalım. Eğer böyle bir kayıt yoksa, dikkate almayalım.

Bu yöntemle farklı bilgisayarlardan veya browserlardan oturum açan aynı kullanıcı her bilgisayarda bu özelliği kullanabilecektir. Bunu istemiyorsanız, kullandığımız tablodaki kullanıcı adı kısmını unique gibi düşünüp sadece tek bir kayıt tutulmasınına izin verirseniz diğer cookieleri geçersiz kılar ve her zaman başarılı olarak son oturum açmış bilgisayar veya browserdan çalışmasını sağlayabilirsiniz.

Ben bu kadarının yeterli olduğu düşünüyorum, banka veya benzeri bir durum için kodlama yapmıyorsanız.

Ayrıca bu işlemi her sayfada yinelemenize gerek yok sadece giriş anında yapsanız yeterli.


Benzer bir sistem oluşturdum ben de ancak yalnızca giriş sayfasında olması nasıl yeterli olacak? Eğer kullanıcı siteye girerken beni hatırlayı seçtiyse ve ikinci girişinde login.php yerine view.php adında başka bir sayfaya gittiyse token kontrolü yapmazsak giriş yapılmış olarak bu sayfa karşısına çıkmayacak?
 

 

mashadow mashadow WM Aracı Kullanıcı
  • Üyelik 08.06.2016
  • Yaş/Cinsiyet 33 / E
  • Meslek Yazılımcı
  • Konum Tekirdağ
  • Ad Soyad M** Y**
  • Mesajlar 4
  • Beğeniler 1 / 2
  • Ticaret 0, (%0)
Yanlızca giriş sayfasında derken, tokeni silip her sayfada yeni bir token vermeye gerek yok. Tabiki her sayfada kontrol olmalı =)
 

 

wmaraci
wmaraci

brown brown WM Aracı Kullanıcı
  • Üyelik 28.10.2013
  • Yaş/Cinsiyet 25 / E
  • Meslek öğrenci
  • Konum İstanbul Avrupa
  • Ad Soyad H** E**
  • Mesajlar 1748
  • Beğeniler 385 / 385
  • Ticaret 27, (%96)

mashadow adlı üyeden alıntı

Yanlızca giriş sayfasında derken, tokeni silip her sayfada yeni bir token vermeye gerek yok. Tabiki her sayfada kontrol olmalı =)


Anladım, ben de öyle yapıyordum. İlgilendiğiniz için çok teşekkürler.
 

 

ismail03 ismail03 WM Aracı Kullanıcı
  • Üyelik 28.11.2013
  • Yaş/Cinsiyet 30 / E
  • Meslek Ameliyathane Hemşiresi
  • Konum Afyon
  • Ad Soyad I** Ç**
  • Mesajlar 2633
  • Beğeniler 344 / 487
  • Ticaret 12, (%100)
brown hocam örnek olarak paylaşabilir misin? çünkü ben şu cookie olayını çözemedim gitti :)
 

 

brown brown WM Aracı Kullanıcı
  • Üyelik 28.10.2013
  • Yaş/Cinsiyet 25 / E
  • Meslek öğrenci
  • Konum İstanbul Avrupa
  • Ad Soyad H** E**
  • Mesajlar 1748
  • Beğeniler 385 / 385
  • Ticaret 27, (%96)

ismail03 adlı üyeden alıntı

brown hocam örnek olarak paylaşabilir misin? çünkü ben şu cookie olayını çözemedim gitti :)


Hocam şöyle yapıyorum;

if ($_POST) {
$username = @strip_tags(trim($_POST["username"]));
$password = @strip_tags(trim($_POST["password"]));
if (empty($username) or empty($password)) {
echo "Lütfen boş alan bırakmayınız.";
die;
} else {
$password= md5($password);
$control = $connect->query("SELECT * FROM members WHERE username='$username' AND password='$password'");
$there_is = $control->num_rows;
if ($there_is == 1) {
$member_info = $control->fetch_assoc();
$remember = @$_POST["remember"];
if ($remember == "yes") {
$member_id = $member_info['id'];
$token= md5($username.time()));
$save_token = $connect->query("UPDATE members SET session_token='$token' WHERE id='$member_id'");
setcookie("token","$token", time()+60*60*24*7);
$_SESSION["acces"] = TRUE;
$_SESSION["remember"] = TRUE;
$_SESSION["username"] = "$username";
$_SESSION["id"] = $member_info["id"];
echo "Başarıyla giriş yaptınız";
} else {
$_SESSION["acces"] = TRUE;
$_SESSION["username"] = "$username";
$_SESSION["id"] = $member_info["id"];
$control_token = $connect->query("UPDATE members SET session_token='not_remember_me' WHERE username='$username'");
echo "Başarıyla giriş yaptınız.";
}
} else {
echo "Girdiğiniz kullanıcı adı ve şifre veritabanında eşleştirilemedi.";
}
}
} else {
echo '
Sistemde işlem yapabilmek için giriş yapmalısınız.







';
}


Burası login.php sayfam. Eğer gelen bir post yoksa giriş kutusunu yazdırıyorum, giriş kutusundan bir post geldiğinde ise giriş işlemine başlıyorum. İlk olarak boş alan var mı bunu kontrol ettiriyorum. Boş alan yoksa kullanıcı ve şifrenin veritabanında eşleşip eşleşmediğine bakıyorum. Eşleşme sağlandığında ise kullanıcı "beni hatırla" seçeneğini işaretlemiş mi işaretlememiş mi buna bakıyorum. Eğer işaretlemediyse yalnızca oturum başlatıyorum. Yok eğer işaretlediyse kullanıcın bilgisayarında (cookie) ve veritabanında saklamak üzere bir "token" oluşturuyorum ve bunun ardından oturumu başlatıyorum.

Ardından her sayfada şu kontrolü yapıyorum;

if(!@$_SESSION["acces"]) {
if(isset($_COOKIE["token"])) {
$token = $_COOKIE["token"];
$control_token = $connect->query("SELECT * FROM members WHERE session_token='$token'");
$control_token_registered = $control_token->num_rows;
if ($control_token_registered > 0) {
$user_infos = $control_token->fetch_assoc();
session_destroy();
session_start();
$_SESSION["acces"] = TRUE;
$_SESSION["username"] = $user_infos["username"];
$_SESSION["id"] = $user_infos["id"];
setcookie("token","$token", time()-3600);
setcookie("token","$token", time()+60*60*24*7);
} else {
session_destroy();
session_start();
}
}
}


Eğer geçerli bir oturum yoksa kullanıcının bilgisayarında token isimli bir cookie olup olmadığına bakıyorum. Eğer cookie mevcutsa bu cookiedeki token değerinin veritabanında eşleşip eşleşmediğini kontrol ediyorum. Eşleştiği takdirde, eşleştiği kişinin hesabına oturum başlatıyorum. Bunun ardından da cookieyi sıfırlıyorum ve 1 haftalık aynı tokendan oluşan yeni bir cookie oluşturuyorum. Böylece kullanıcı 1 haftadan kısa sürede siteye girdiğinde oturumu yenilenmi oluyor.
 

 

wmaraci
wmaraci
Konuyu toplam 1 kişi okuyor. (0 kullanıcı ve 1 misafir)
Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al