Hallo allemaal, ik ben nieuw met php en mysql en ben een maand of 2 geleden begonnen met het leren ervan.
Nou heb ik een tutorial gevolgd om een loginscript te maken, nou vroeg ik me af of het misschien nog beter beveiligd moet worden.
if ($inlognaam&&$wachtwoord)
{
$connect = mysql_connect ("localhost","root","") or die ("Kan niet verbinden");
mysql_select_db ("test") or die ("Kan db niet vinden");
Een aantal punten die me direct opvallen:
- wachtwoord ongecodeerd in database, gebruik hash(),
- onnodige stripslashes,
- foutafhandeling ontbreekt,
- session_register en session_is_registered zijn verouderd, gebruik $_SESSION,
- de laatste regels van login_check.php kloppen niet: dubbele else.
Agirre heeft gedeeltelijk gelijk over de dubbele else.
Als je goed zou inspringen zul je zien dat de eerste else nog van een if statement in de if statement komt. Desondanks klopt hij niet omdat je bij de 1-na-laatste else de brackets ( "{" en "}" ) vergeet!
edit:
* onnodig variabelen gaan definieren, je kan prima werken met post variabelen, en de stripslashes kun je tegelijk in de query toepassen.
* variabelen buiten quotes halen (bijv. in query)
* Mocht hash() je als beginner wat lastig lijken, kan je ook prima werken met [php]md5[/php]($_POST['wachtwoord']) , alleen wees je ervan bewust dat er tegenwoordig databases worden bijgehouden met bekende md5 wachtwoorden, dus overweeg [php]sha1[/php] (iets minder bekend, maar ook daar als DB's voor), of dus gewoon wel de [php]hash[/php]() functie
edit 2:
* Je moet zelf even wat onderzoek doen naar de goede combinatie van [php]stripslashes[/php] & [php]mysql_real_escape_string[/php] (ivm. magic quotes die soms aan en soms uit staan)
Even snel je code herschreven, Zoals eerder gezegd, Sla je wachtwoord als MD5 op. Zorg ook dat je sql injection tegen gaat, En dat je goeie checks uitvoert.
<?PHP
/* Inlognaam check */
if(isset($_POST['inlognaam'] && !empty($_POST['inlognaam']))
{
/* Wachtwoord check */
if(isset($_POST['wachtwoord'] && !empty($_POST['wachtwoord']))
{
/* Query uitvoeren */
$Query =
"
SELECT
ID
FROM
tabel
WHERE
inlognaam = '".mysql_real_escape_string($_POST['inlognaam'])."'
AND
wachtwoord = '".md5($_POST['wachtwoord'])."'
";
/* Result */
$Result = mysql_query($Query);
/* Kijken of query is gelukt. */
if(!$Result)
{
echo 'Fout opgetreden met query, '.$Query.'';
}
else
{
/* Kijken of er een result is. */
if(mysql_num_rows($Result) !== 0)
{
/* Sessies aanmaken. */
$Rij = mysql_fetch_assoc($Result);
@Ark
Ziet er al beter uit, alleen waarom zou je het IP vanuit de database selecteren? Dat wil je niet. Als je het IP in een sessie wilt hebben (wat soms handig is), gebruik dan $_SERVER['REMOTE_ADDR'].
@Afra
Je kan md5 ook prima met hash() voor elkaar krijgen.
Klopt, voor een beginner is dat inderdaad makkelijker. Alleen hash() is meer flexibel en biedt meer mogelijkheden, dus vandaar dat ik deze altijd gebruik (meestal sha256).
Stem ik zeker mee in, en ik raad dan ook eigenlijk het gebruik van hash() aan. En met 35 algoritmes is de keuze reuze :)
Begrijp wel, de encryptie (ok, hash is officieel gezien geen encryptie) kan nog zo goed zijn, het gaat om de manier waarop het gebruikt wordt in een systeem. (evt. as easy as SQL INJECTION)