En fråga om php if-statement

Allt om hård- och mjukvara samt övriga it-relaterade diskussioner.

 Moderatorer: Alien, atoms

En fråga om php if-statement

Inläggav artifex » 2013-11-08 7:10:39

Jag sitter och knåpar lite lätt på ett php skript för skojs skull och har en fråga om if statements.

Kan man köra följande:

Kod: Markera allt
if (filter_var($array_variabel[0],FILTER_SANITIZE_EMAIL) == TRUE
för att kontrollera OM en variabel eller array kan filtreras med sanitera epost filtret eller gör den snutten någonting helt annat?
artifex
 
Inlägg: 57
Anslöt: 2013-10-25

En fråga om php if-statement

Inläggav nallen » 2013-11-08 7:58:12

Jag kan inte PHP, men är helt övertygad om att koden ovan innehåller ett syntax-fel då parenteserna är inte balanserade. Vidare är det sannolikt helt meningslöst och förvirrande att jämföra med TRUE - om uttrycket på vänster sida redan är ett logiskt värde är jämförelsen överflödig och om det inte är det så innebär jämförelsen ett typ-fel...

Vi får väl läsa referensmanualen:
http://php.net/manual/en/function.filter-var.php skrev:Return Values

Returns the filtered data, or FALSE if the filter fails.
tolkar jag som att att jämförelsen aldrig kan bli sann, men jag kan som sagt inte PHP... kan den konvertera godtyckliga strängar (för det är väl vad filter_var ska operera på och därmed returnera i det första fallet) till logiska sanningsvärden?
nallen
 
Inlägg: 19461
Anslöt: 2006-08-27
Ort: Vid Skogen

En fråga om php if-statement

Inläggav artifex » 2013-11-08 8:43:12

Helt rätt! Det är ett syntaxfel, då det ska vara
if (filter_var($array_variabel[0],FILTER_SANITIZE_EMAIL) == TRUE)


Jag vill gärna av säkerhetsskäl kontrollera att en variabel utan problem faktiskt kan filtreras, istället för att utgå ifrån att filtreringen sker och att det sedan kan finnas tecken som kan orsaka SQL injektion.
artifex
 
Inlägg: 57
Anslöt: 2013-10-25

En fråga om php if-statement

Inläggav abyss » 2013-11-08 13:17:55

nallen skrev:Jag kan inte PHP, men är helt övertygad om att koden ovan innehåller ett syntax-fel då parenteserna är inte balanserade. Vidare är det sannolikt helt meningslöst och förvirrande att jämföra med TRUE - om uttrycket på vänster sida redan är ett logiskt värde är jämförelsen överflödig och om det inte är det så innebär jämförelsen ett typ-fel...

Vi får väl läsa referensmanualen:
http://php.net/manual/en/function.filter-var.php skrev:Return Values

Returns the filtered data, or FALSE if the filter fails.
tolkar jag som att att jämförelsen aldrig kan bli sann, men jag kan som sagt inte PHP... kan den konvertera godtyckliga strängar (för det är väl vad filter_var ska operera på och därmed returnera i det första fallet) till logiska sanningsvärden?

Du har rätt
Kod: Markera allt
if (filter_var($array_variabel[0],FILTER_SANITIZE_EMAIL) )
ska räcka för önskat resultat.

Eftersom du inte kan PHP så är det svårt att förstå sig på all magi som händer i PHP :lol: Alla strängar == true, till och med "false" == true är true. Men "string" === true är false. Men det finns ett undantag! "0" == true är false :roll:

artifex skrev:Helt rätt! Det är ett syntaxfel, då det ska vara
if (filter_var($array_variabel[0],FILTER_SANITIZE_EMAIL) == TRUE)


Jag vill gärna av säkerhetsskäl kontrollera att en variabel utan problem faktiskt kan filtreras, istället för att utgå ifrån att filtreringen sker och att det sedan kan finnas tecken som kan orsaka SQL injektion.

Det är dock ett väldigt dåligt sätt att hantera mailadresser på. Du bör använda FILTER_VALIDATE_EMAIL och ge användaren ett felmeddelande istället för FILTER_SANITIZE_EMAIL som ofta kommer leda till att du får en felaktiga mailadresser lagrande eftersom att den modifierar adresserna.

Om du gör vad jag tror du gör så är det något liknande:
Kod: Markera allt
if (filter_var($array_variabel[0],FILTER_SANITIZE_EMAIL) == TRUE) {
  ...
  INSERT INTO stuff(mail) VALUES($array_variabel[0])
  ...
}

Vilket inte gör ett skit eftersom att $array_variable[0] fortfarande kan innehålla precis vad som helst. Ska det bli någorlunda rätt måste du köra med

Kod: Markera allt
if (filter_var($array_variabel[0],FILTER_SANITIZE_EMAIL) == TRUE) {
  ...
  $sanitizedMail = filter_var($array_variabel[0],FILTER_SANITIZE_EMAIL);
  INSERT INTO stuff(mail) VALUES($sanitizedMail)
  ...
}


Men ska du göra det på ett vettigt sätt är det mer i den här stilen du bör göra
Kod: Markera allt
if (filter_var($array_variabel[0], FILTER_VALIDATE_EMAIL)) {
  ...
  INSERT INTO stuff(mail) VALUES($array_variabel[0])
  ...
}
else {
  echo "Ogiltig mail";
}


Sen när det gäller SQL injections så kan du göra dig själv en tjänst och lär dig att jobba med PDO. Jobbar du med PDO och ALLTID använder prepared statements så kommer du aldrig få något problem med SQL injections, även om du klantar dig och glömmer att validera/filtrera något så är du ändå skyddad från katastrof.
http://net.tutsplus.com/tutorials/php/w ... se-access/
abyss
 
Inlägg: 70
Anslöt: 2011-05-10

Återgå till IT-forum



Logga in