Voor een puur persoonlijke website (alleen foto's uploaden, 1 gebruiker) wil ik een eenvoudig doch zo veilig mogelijk admin/inlogscript hebben.
SSL is natuurlijk de meest ideale oplossing, maar zie ik, gezien mijn huidige wens, als overkill.
Ingebouwd in PHP5.5 en hoger zit password_hash en password_verify
Is dit veilig genoeg?
Met password_hash krijg ik wel de gegevens in de database, maar het controleren met password_verify lukt me niet. De uitkomst van password_hash is, als ik het goed begrijp, elke keer anders.
Maar hoe controleer je dan met password_verify de combinatie gebruikersnaam / wachtwoord?
>> Een hobbysite kan ook worden gehackt en vervolgens worden misbruikt voor spam, phishing, file sharing, enzovoort, enzovoort.
Da's waar ... maar hoe helpt ssl tegen deze specifieke zaken dan?
Anyhow ... Let's Encrypt is toch ook gratis?
[size=xsmall]Toevoeging op 04/08/2016 07:53:06:[/size]
>> Of is het met ssl niet meer nodig om gegevens gecodeerd op te slaan in de database?
Jawel, dat is altijd nodig voor het geval je database wordt gehackt.
SSL beveiligt het verkeer tussen de server en je browser. In plaats van dat er dan 'wachtwoord123' wordt overgestuurd, wordt er zoiets als 'XZB_23dfd!DSsdyyyta' (ik verzin maar wat) overgestuurd zodat als iemand het signaal 'afluistert' (een zogenaamde man-in-the-middle-attack) hij het wachtwoord niet kan zien.
Maar $pass levert telkens een andere waarden op, zelfs met dezelfde gegevens. Hoe controleer je dan de inloggegevens die worden opgegeven met die in de database?
Gefeliciteerd! Hij doet het helemaal goed! ;)
Het is ook de bedoeling dat er een andere hash uitkomt.
Dat is nou het mooie van password_hash().
Met password_verify() controleer je of de hash goed is of niet.
Dus het eenvoudigst is, om een opzetje te maken met een paar simpele if statements:
In een notendop:
<?php
// effe voor de eenvoud
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
// simpele query uitvoeren om de gegevens uit te poepen..
if (password_verify($row['password_from_db'], $hash)) {
//echo 'Password is valid!';
// Dit is wel belangrijk...
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
// If so, create a new hash, and replace the old one
$newHash = password_hash($hash, PASSWORD_DEFAULT);
// insert into DB ...
// login verdergaan
}
} else {
echo 'Invalid password.';
// zend ze terug naar formulier of google o.i.d.
}
?>
edit
En nu snap ik pas waar jij tegenaan loopt.
Dat had ik dus ook in het begin, jou gedachte is om een WHERE username = AND password = te willen controleren. Dat werkt dus nu niet meer. Dat hoeft dus ook niet meer.
Immers, het enige wat je doet is controleren of username of email in de database staat. Is dat zo dan kijk je of het password erbij past. Overigens, doe ik tegenwoordig geen username meer maar met email. Die is immmers uniek voor een gebruiker. Maar dat is meer een persoonlijke voorkeur.
Maar $pass levert telkens een andere waarden op, zelfs met dezelfde gegevens. Hoe controleer je dan de inloggegevens die worden opgegeven met die in de database?
Gefeliciteerd! Hij doet het helemaal goed! ;)
Het is ook de bedoeling dat er een andere hash uitkomt.
Dat is nou het mooie van password_hash().
Dat vermoeden had ik al.;-)
Bart V B op 04/08/2016 09:00:29
edit
En nu snap ik pas waar jij tegenaan loopt.
Dat had ik dus ook in het begin, jou gedachte is om een WHERE username = AND password = te willen controleren. Dat werkt dus nu niet meer. Dat hoeft dus ook niet meer.
Immers, het enige wat je doet is controleren of username of email in de database staat. Is dat zo dan kijk je of het password erbij past.
Dus toch. Maar dat blijf ik een vreemde gedachtegang vinden.
Hoe weet je dan of het wachtwoord klopt met wat wordt opgegeven?
Ga nog wel eens thuis proberen.
Nou, op zich is het niet vreemd.
Zoals ik al zei ik gebruik tegenwoordig email en password.
Email is uniek, (of beter maakt het uniek in de db).
Je doet eigenlijk het zelfde alleen haal je eerst gegevens op en dan controleer je pas.
Er zit alleen een extra laagje/stukje in.
Ook de anderen bedankt voor reageren.
Ga me verdiepen in de (gratis) mogelijkheden van SSL / sftp.
Dat cacert weet ik zo net nog niet: www.cacert.org gebruikt een ongeldig beveiligingscertificaat. Het certificaat wordt niet vertrouwd, omdat het is ondertekend via een ondertekeningsalgoritme dat is uitgeschakeld omdat dat algoritme niet beveiligd is. Foutcode: SEC_ERROR_CERT_SIGNATURE_ALGORITHM_DISABLED
Bij Let'sEncrypt kom ik op https://certbot.eff.org/
Moet daar uit twee pulldown menu's kiezen. Denk dat ik dat beter kan opvragen bij hostingbedrijf (?!)
Betwijfel of ik die installatie instructies kan/mag uitvoeren.
Dat ssl verhaal, als je een gewoon hosting pakket hebt bij een hostingboer, dan is het wat beperkter.
Als je geen commandline hebt, (VPS e.d.) dan is let's encrypt geen optie voor je.
Maar kan het helemaal mis hebben, weet niet bij wie je hosting is ondergebracht?
Antagonist.
Heb op https://forum.antagonist.nl/viewtopic.php?f=2&t=13121&p=75929&hilit=ssl+encrypt#p75929 informatie gevonden, maar dat ziet er nog vrij complex uit. Tevens (b)lijkt dat het maar drie maanden werkt/geldig is.
Uit het topic begrijp ik ook dat er gekeken wordt/gewerkt aan een oplossing, om net als bv. Joomla te laten installeren via het controlpanel. Kan me alleen maar aansluiten bij die wens.