Açıklama Başarısız NEREDE Hangi Bölüm (ler) belirleyin

5 Cevap php

Diyelim ki bir kullanıcı oturum denetler böyle bir SQL deyimi var diyelim:

SELECT * FROM users 
WHERE username='test@example.com', password='abc123', expire_date>=NOW();

Şartın münferiden kendi sorgu ve test içine her bir durumu ayrı kalmadan, başarısız NEREDE özellikle belirlemek için SQL bir yolu var mı?

Bu özel örnekte geliştirici tam giriş için girişimi başarısız nedenini kullanıcılara anlatmak için izin verecek.

Benim amaçlar için PHP / MySQL kullanıyorum.

5 Cevap

Burada ben ile geldi budur:

SELECT
  IF(mem_username='test@example.com','true','Error: Bad Username') AS mem_username,
  IF(mem_password ='abc123','true','Error: Bad Password') AS mem_password'
FROM MEMBERS
WHERE mem_username='test@example.com' AND mem_password='abc123'

Bu şekilde ben hata iletileri için kodu tespit etmek ve daha sonra gerektiğinde bunları görüntüleyebilirsiniz.

NOTE: Eğer örnek kod ile güvenlik kaygıları gerekçe tüm için, ilgi için teşekkür ederiz. Ancak bu, ben soruyu göstermek için sadece basit bir örnek oldu, gerçek üretim kodu değil. Bu açık metin şifreleri depolamak ve kullanıcılara giriş başarısız neden özelliklerini vermek gerektiğini de oldukça açıktır.

Peki, yapabileceği tek şey, sadece kullanıcı adı maçları yüzden sorguyu değiştirmek olduğunu. Sonra kod Uygun hataları dönen, şifre ve son kullanma tarihini kontrol edin.

Ayrıca, ben senin örnek sorgu bir sadeleştirme umut; Kesinlikle size şifreleri karma / şifreleme / tuzlama olmalı ve belli bir süre, vb içinde başarısız denemelerinin sayısını sınırlayan bir şeyler içermelidir ..

Bildiğim kadarıyla gerçek soru (aradığınız sonuçlara tersine) gibi, nerede yan tümcesi bu bilgileri almak için bir yol yoktur. Yapabileceğin en yakın gibi bir şey olurdu:

SELECT *,
    CASE WHEN Password = 'asdf' THEN 1 ELSE 0 END AS IsPasswordMatch,
    CASE WHEN Expiration >= NOW() THEN 1 ELSE 0 END AS IsActiveAccount
FROM Users
WHERE Username = 'user'

MySQL Eğer seçme listesinde Boole ifadeleri koyabilirsiniz. Boole ifadeleri 1 true tamsayı değerlendirmek, ya da yanlış tamsayı 0.

SELECT password = 'abc123' AS is_authenticated,
       expire_date >= NOW() AS is_not_expired
FROM users
WHERE username='test@example.com';

Eğer, RDBMS'in diğer markalar üzerinde çalışan bir sorgu yazmak akılda tutmak gerekir note: boolean ifadelerin bu kullanımı standart değildir. Diğer millet attılar CASE sözdizimi kullanın.

Not: Bu soru bir teğet, ama düz metin şifreleri saklamak için değil çağırıyorum. Tuzlu şifre karma özetini saklayın. Bkz http://stackoverflow.com/questions/420843/need-some-help-understanding-password-salt

Hayır, burada fıkra bir blok olarak uygulanır, ve tüm satırlar taranacak zorunda böylece çeşitli teknikler kullanılır. Ayrıca, nasıl arzu edilmiştir biriydi satır bilmek istiyorsunuz?

Ayrıca, muhtemelen kullanıcıya bir oturum açma girişimi başarısız neden hakkında çok fazla söylemek istemiyorum. Çok fazla söyleyerek böyle hesap madencilik ve şifre saldırıları gibi patlatır sağlar.

Eğer gerçekten kullanıcıya bu görüntülemek için istiyorum yoksa edit, daha sonra farklı bölüme mantık bölünmüş:

  1. Validate identity
    Action: Fetch the corresponding user row from the database
    Result:
    • Böyle bir satır => geçersiz hesabı varsa
    • Satır döndürdü, 2. adıma devam edin.
  2. Validate credential
    Action: Check the stored credential (password, hash of password or encrypted password) against the supplied password treated in the same way the credential is stored.
    Result:
    • Hiçbir maç => Geçersiz şifre / kimlik
    • Maç => Başarılı oturum açma girişimi
  3. Login user
    Action: Add data to session etc.

Muhtemelen ile sadece nerede fıkra parçaya ayırmak gerekir 'VE'

SELECT * FROM users 
WHERE username='test@example.com'
   And password='abc123'
   And expire_date>=NOW();