Skrivet av Pandy95:
Hej
Jag har skrivit en kod som ska registrerarar användare. Jag testar lite saker tillexempel e-mail, längd på användarnamn, lösen och mail. Problemet är att ibland står det att mailen har förmåga tecken utan att det överstiger 50 tecken, som är max.
<?php
require ('connects.php');
function register($error_message){
if(isset($_POST['user'])&&isset($_POST['mail'])&&isset($_POST['password'])&&isset($_POST['rep_password'])){
if(!empty($_POST['user'])&&!empty($_POST['mail'])&&!empty($_POST['password'])&&!empty($_POST['rep_password'])){
$user = trim($_POST['user']);
$mail = trim($_POST['mail']);
$password = trim(md5($_POST['password']));
$rep_password = trim(md5($_POST['rep_password']));
$pattern_email = '/^(.+)@(.+).([a-ö]{2,3})$/';
if($user<=30&&$password<=50&&$mail<=50){
if(preg_match($pattern_email,$mail)){
if($rep_password === $password){
$insert = "INSERT INTO `brommund_se`.`users` (`id`, `username`, `password`, `mail`) VALUES ('','$user','$password','$mail')";
if(mysql_query($insert)){
header('Location: http://www.google.se');
}else{
$error_message[] = 'Kunde inte registrera! Försök igen.';
}
}else{
$error_message[] = 'Lösenorden matchar inte!';
}
}else{
$error_message[] = 'Skriv in en giltig e-postadress!';
}
}else{
if($user>30){
$error_message[] = 'Användarnamnet är för långt (max 30 tecken)!';
}
if($password>50){
$error_message[] = 'E-postadressen är för lång (max 50 tecken)!';
}
if($mail>50){
$error_message[] = 'Lösenordet är för långt (max 50 tecken)!';
}
}
}else{
$error_message[] = 'Fyll i alla fält!';
}
}
return $error_message;
}
?>
//Andreas
if($user<=30&&$password<=50&&$mail<=50){
På den här raden jämför du ifall $user, som är ett namn i form av en sträng, är mindre än eller lika med heltalet 30, och detsamma för lösenord och email. Vad som händer här är att PHP försöker omvandla namnet till ett heltal för att dessa olika typer ska gå att jämföra, och du får därför varierande resultat. Istället måste du kontrollera strängens längd via strlen, eller mb_strlen om du använder ett multibytecharset. $password kommer alltid vara 128b lång så den behöver du inte kontrollera alls, vill du kontrollera att lösenordet uppfyller några särskilda krav måste detta ske innan du kör det genom hashfunktionen. Använd gärna whitespace för att göra koden mer lättläst med.
if(strlen($user) <= 30) {
/^(.+)@(.+).([a-ö]{2,3})$/
Rangen i det här regexpet gör inte vad du tror, a-ö betyder inte alla tecken i vårat svenska alfabet utan alla tecken mellan dessa två positioner i den teckentabell du använder dig av. Email bör inte valideras med hjälp av regex alls, PHP har inbyggda funktioner för att hjälpa till med det, men om du absolut vill så finns det ett korrektare regex här.
if(filter_var($email, FILTER_VALIDATE_EMAIL) !== false) { /* ... */ }
$insert = "INSERT INTO `brommund_se`.`users` (`id`, `username`, `password`, `mail`) VALUES ('','$user','$password','$mail')";
if(mysql_query($insert)){
Du bör inte skicka en tom sträng som ID, uteslut det helt och hållet från din query om det är en auto increment. Du bör även använda dig av mysqli eller PDO istället för den gamla mysql-modulen när du ansluter till mysqldatabaser, de två nyare modulerna har exempelvis stöd för prepared statements som hjälper dig att skriva säkra databasfrågor. Notera att detta bara påverkar hur du ansluter till databasen, mysqlservern berörs inte. Om inte har tillgång till dessa så måste du escapa all användardata manuellt, och gärna via sprintf för att hålla koden läsligare:
$insert = sprintf(
'INSERT INTO brommund_se.users (username, password, mail) VALUES("%s", "%s", "%s");',
mysql_real_escape_string($user),
mysql_real_escape_string($password),
mysql_real_escape_string($mail)
);
Gör du inte detta kan användaren skicka fragment av databasfrågor direkt till din server, och köra helt andra kommandon än vad du har tänkt dig. Se wikipedia för en introduktion till sql-injektion. Rekommenderar dock att du ser över alternativen, och har i åtanke att alla guider som rekommenderar mysql_-funktionerna är utdaterade (även om de för den skull kan innehålla annan information som fortfarande är relevant).
header('Location: http://www.google.se');
När man skickar en location-header vill man vanligen avbryta scriptet direkt efteråt. Notera att resten av scriptet kommer köras som vanligt och att besökarens browser laddar nästa sida först efter att allt annat är klart. Det kanske är vad du har tänkt dig, kanske inte.
header('Location: http://www.google.se');
die();
Man bör heller aldrig avsluta PHP-scripts med ?> eftersom att det riskerar att lämna whitespace på slutet av filerna som kan skickas innan eventuella headers och orsaka en flora av olika problem för ditt program. Dessutom är det mer att skriva än om man låter bli. Använd bara slut-taggarna om du måste fortsätta med annat innehåll efteråt, exempelvis i HTML-templates.