29. april 2005 - 14:07Der er
29 kommentarer og 1 løsning
Overførsel af URL.
Hey;
Jeg vil blot høre, om nogen herinde kan fortælle mig, hvordan jeg får overført hele url'en til en side?
Jeg har en side med en formular, og der vil jeg gerne have det sådan, at når man trykker submit, skal den url der er på siden med formularen (med alle GET-variabler inkluderet) sendes videre til den side der bliver kaldt med formularen.
Er den bedre end htmlentities eller hvordan? Så vidt jeg kan se erstatter den alle specielle html-tegn, hvor htmlspecialchars kun erstatter nogle få...
"This function is identical to htmlspecialchars() in all ways, except with htmlentities(), all characters which have HTML character entity equivalents are translated into these entities."
Det må du så vurderer om det er smarter.
(Kan du ikke læse engelsk, siden du ikke selv slår det op?)
Jo, kan godt læse engelsk, og har også læst det du citerer. Min erfaring inden for php er dog forholdsvis lille, og derfor håbede jeg, at du måske havde en større erfaring der fortalte dig, hvad der viste sig at være den bedste løsning:)
Jeg vil mene at htmlspecialchars() nok er bedst i denne situation. Hvis man man har en URL i stil med index.php?navn=Møllegaard
så er det ikke så hensigtsmæssigt at gemme det som index.php?navn=Møllegaard
For det er jo ikke det URLen er.
Det vigtigste er at få lavet " om til " da det kan øldelægge dit <input>-tag. Det er nok sjældent at man vil bruge en URL med " i, men forstil der en ondsindet bruger der gerne vil vise noget på din side - det ville han kunne gøre hvis du ikke sørger for at køre det igennem htmlspecialchars/htmlentities.
At man stoler på brugeren. Dvs, cookies kan ændres. Forms og URLs bliver ændret. Dvs dit skjulte id i formen kan du ikke antage er rigtigt. Vær sikker på at dine ID'er er tal. Mistænk altid data fra brugeren.
Test fx dine URLs og forme med hvordan de reagerer på '-tegnet. (hvis variablerne bruges til SQL). Bruge $_SESSION (disse data gemmes jo på serveren) over $_COOKIES (som gemmes hos brugere - så skal vi være forsigtig) så vidt muligt (det kan man ofte, men til autologin er session ikke til megen nytte).
Prøv at skrive html ind i dine forms. Hvis en laver et alert() javascript og submitter det og hvis du ukritisk viser det, vil alle folk kunne se den alert. Og det er så stadig relativt harmløs. Men javascript kan man meget som kan bruges til ondeting<tm> :)
Det var lige hvad jeg kunne komme på. Men ellers er det jo bare med at gøre sig sine erfaringer. Alle laver jo fejl, så det er bare med at komme igang :)
du bør tænke dig om hver gang du har noget indput fra brugeren. Hvis du fx viser et tekstfelt uden at tjekke det, kan det misbruges. Det kan htmlspecialchars/htmlentities/strip_tags o.lign gøre noget ved. Ofte er htmlspecialchar en god ven :)
Fx ved du at id er et tal, så kan du jo bruge ctype_digit for at tjekke efter, eller bruge: $id = intval($_GET['id']);
så er du altid sikker på at $id er et tal.
'-tegnet er bare en primitiv måde at se om der er en mulig sql-injection. Forstil dig:
mysql_query("DELETE FROM articles WHERE id = {$_GET['id']}") or die(mysql_error());
normalt vil dette jo slette en række, når fx: site.com/delete.php?id=2 kaldes. Da SQL'en vil se sådan her ud: "DELETE FROM artciles WHERE id = 2". Og det er jo hvad vi ønsker.
Lad os så antage at jeg vil gøre livet surt for dig, så kan jeg skrive: site.com/delete.php?id=1+OR+1=1
Så vil SQL'en blive til: "DELETE FROM artciles WHERE id = 1 OR 1=1"
Da 1 er lig med 1, vil sql slette alle rækker i databasen. Det var jo ikke helt meningen. Det kan ske hvis man ikke tjekker ordenligt på parameteren. Kan du se problemet?
'-tegnet kan du (selvom det er primitivt) teste om sql'en fejler. Kalder vi site.com/delete.php?id=1'
bliver sql'en til: "DELETE FROM artciles WHERE id = 1'"
Jo forstå sådan set godt, at "DELETE FROM artciles WHERE id = 1'" fejler, forstår bare ikke helt hvad du mener med sætningen: '-tegnet kan du (selvom det er primitivt) teste om sql'en fejler
Hvis du bruger '-tegnet i de parametre til dine scripts, som du ved bliver brugt iforbindelse med sql, så vil du fremprovokerer en SQL fejl, da det giver et ugyldigt SQL statement - hvis det ryger direkte ind i din sql uden at blive "behandlet" - dvs escaped eller lign.
Hvis SQL'en fejler pga et '-tegn, så er der et sikkerhedsproblem generelt. Det "smarte" ved at teste med ' er at du får en fejl i sqlen. Hvis du sætter a'er ind, vil mysql ikke normalt melde fejl - men så vil du ikke se det ligeså tydeligt at a'erne er kommet ind i dit sql statement. Ellers glem det med '-tegnet. Det vigtigste er bare at mistænke brugeren for at være en badguy, gør du det, så er du ikke helt tabt bag en vogn :)
ahhhh nu tror jeg ved hvad du mener:D Du vil have mig til at køre get-variabler der skal være tekst igennem fx html-entities lige som man køre heltalts get-variabler igennem intval()?
Jep præcist. Men bare husk på, at selvom det ikke fejler, så begyder det ikke at der kan være problemer. Men bare det du er opmærksom på disse aspekter gør at din kode bliver sværere at bryde iforhold til mange andre php programmører :)
Ville det egentligt ikke være mest optimalt, at lave en funktion, der fjerne alle uønskede tegn fra en given streng, og så kalde den på alle get-variabler der skal være strenge?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.