Vra

Kom ons sê ek het'n SQL-stelling soos hierdie wat tjeks'n gebruiker login:

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

Is daar'n manier in SQL om te bepaal wat spesifiek WAAR die voorwaardes nie, sonder om te skei elke toestand in sy eie navraag en toets individueel?

In hierdie spesifieke voorbeeld sou dit toelaat dat die ontwikkelaar om gebruikers te vertel presies die rede waarom hul poging om aan te meld nie.

Vir my doeleindes, ek is met behulp van PHP/MySQL.

Was dit nuttig?

Oplossing 5

Hier is wat ek het met:

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'

Op hierdie manier het ek kan opspoor in kode vir fout boodskappe en dan wys hulle as dit nodig is.

Nota: Om julle almal met verwysing na veiligheid met die voorbeeld kode, dankie vir jou besorgdheid. Dit is egter nie die werklike produksie-kode dit was net 'n eenvoudige voorbeeld om die vraag wat ek moes demonstreer. Dit is voor die hand liggend dat jy nie wagwoorde moet stoor in duidelike teks, en dat jy nie gebruikers moet gee besonderhede oor hoekom login versuim.

Ander wenke

Wel, een ding wat jy kan doen is om te verander jou navraag sodat dit net wedstryde op die rekening. Dan in die kode van die wagwoord en die vervaldatum kyk jy, terugkeer toepaslike foute.

Ook, ek hoop jou voorbeeld navraag is 'n vereenvoudiging; Sekerlik jy moet sout / versleutelen / hashing jou wagwoorde, en jy moet iets wat die aantal mislukte pogings beperk binne 'n sekere tydperk, ens insluit ...

Sover jou werklike vraag (in teenstelling met die resultate wat jy is op soek na), daar is nie 'n manier om daardie inligting uit die waar klousule kry. Die naaste wat jy kan doen sou so iets wees:

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'

In MySQL jy kan Boolse uitdrukkings in die kies-lys sit. Boolse uitdrukkings te evalueer om die getal 1 toe waar, of die getal 0 wanneer vals.

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

Nota: As jy nodig het om 'n navraag wat werk op ander handelsmerke van RDBMS skryf, hou in gedagte hierdie gebruik van Boolse uitdrukkings is standaard. Gebruik die CASE sintaksis wat ander mense gepos.

PS: Dit is 'n raaklyn vanaf jou vraag, maar ek vermaan julle om nie wagwoorde op te slaan in skoonteks. Stoor 'n hash opsomming van die gesoute wagwoord. Sien Hoe wagwoord sout help teen 'n reënboog tafel aanval?

Nee, die waar-klousule is van toepassing as'n blok, en verskeie tegnieke word gebruik, so dat nie al die rye moet geskandeer word.Ook, hoe sal jy weet wat die ry was die een wat jy wil?

Daarbenewens, het jy waarskynlik nie wil hê om jou te vertel die gebruiker te veel oor die rede waarom'n teken poging het misluk.Sê te veel laat vir wedervaringe, soos rekening mynbou en wagwoord aanvalle.

wysig As jy werklik wil om te wys dit aan jou gebruiker, dan verdeel jou logika in verskillende dele:

  1. Die geldigheid van identiteit
    Aksie:Haal die ooreenstemmende gebruiker ry van die databasis
    Gevolg:
    • Indien geen sodanige ry bestaan => ongeldig rekening
    • Indien ry is terug, voort te gaan na stap 2.
  2. Die geldigheid van bewyse
    Aksie:Check die gestoor diploma (wagwoord, hash van die wagwoord of geïnkripteer wagwoord) teen die verskaf wagwoord behandel in die dieselfde manier waarop die bewyse is gestoor.
    Gevolg:
    • Geen wedstryd => Ongeldige wagwoord / bewyse
    • Pas => Suksesvolle login poging
  3. Gebruiker Login
    Aksie:Voeg data te sessie ens.

Jy het waarskynlik net nodig het om die dele van die waar klousule met aparte EN '

SELECT * FROM users 
WHERE username='test@example.com'
   And password='abc123'
   And expire_date>=NOW();
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top