Avatar billede haolan Nybegynder
16. marts 2008 - 18:58 Der er 27 kommentarer og
1 løsning

sikring mod XSS

Hej

Jeg er ved at udvikle en brugeroprettelse og til dette har jeg lavet en fil der håndtere indsættelsen af inputs i databasen.

Valideringen laver jeg med javascript på selve formen.

Jeg vil nu gerne sikre at ingen udefra kan gå ind og udnytte min brugeroprettelse ved at sende de samme post requests til min indsættelses fil.

Hvordan sikre jeg dette?
Avatar billede olebole Juniormester
16. marts 2008 - 19:19 #1
<ole>

JavaScript validering er _kun_ til for brugerens skyld. Det er der _absolut_ ingen sikkerhed ved. Du skal helt sikkert validere med PHP før indsættelse.

Derudover kunne du bruge captcha:
    http://www.eksperten.dk/artikler/1019
    http://www.eksperten.dk/artikler/1106

- men det er svært at råde, når man ikke kender konteksten

/mvh
</bole>
Avatar billede haolan Nybegynder
16. marts 2008 - 19:46 #2
det er en brugeroprettelse til en ny udgave af www.motionsloggen.dk

tvivler på captcha kan bruges til at sikre mod xss i dette tilfælde?

Min form peger på en adduser.php, der laver en insert i min db via en membership klasse og hvis funktionen på membershipklassen returnere true sender den brugeren videre til et bekræftelsessite.

Mere er der ikke i den... Det jeg er bange for er at adduser.php kan tilgåes udefra af nogle der efterligner min form og på den måde kan oprette brugere andre steder fra.
Avatar billede leif Seniormester
16. marts 2008 - 20:43 #3
Så må du jo lave et tjeck i adduser.php som sikrer at den kommer fra dig selv
Avatar billede olebole Juniormester
16. marts 2008 - 22:24 #4
Hvordan i alverden skulle man efterligne din form, hvis du bruger captcha? Ved du, hvad captcha er?  :)
Avatar billede haolan Nybegynder
16. marts 2008 - 22:31 #5
Ja bruger selv captcha på den gamle udgave af motionsloggen.dk, men den fil jeg sender til ved da ikke hvad captcha koden skal være?
Avatar billede olebole Juniormester
16. marts 2008 - 22:34 #6
- så lyder det ikke, somom du bruger captcha - eller ved, hvad det er  :)
Avatar billede erikjacobsen Ekspert
16. marts 2008 - 22:34 #7
Du sætter bare en sesssions-variabel, du kan kontrollere på.
Avatar billede olebole Juniormester
16. marts 2008 - 22:36 #8
- men du skal huske at tjekke, at session-variablen er præcis magen til teksten. Ellers laver du bare en ligegyldig quiz til brugeren, som intet har med captcha eller sikkerhed at gøre  ;o)
Avatar billede olebole Juniormester
16. marts 2008 - 22:38 #9
- og læg mærke til det, jeg skrev vedr. JavaScript og validering. Validerer du udelukkende med JavaScript, kan du ligeså godt lade være  =)
Avatar billede erikjacobsen Ekspert
16. marts 2008 - 22:39 #10
Det var ikke lige det jeg mente ... når spørgerens captcha-dingenot er godkendt, sættes en sessionvariabel som "den fil jeg sender til".php kan kigge på.
Avatar billede erikjacobsen Ekspert
16. marts 2008 - 22:45 #11
Ellers også snakker vi forbi hinanden - den udgave du har nu fungerer vel som den skal. Så hvad er problemet i din nye udgave i forhold til den du har?
Avatar billede olebole Juniormester
16. marts 2008 - 22:46 #12
Erik >> Ja, det er klart - men først skal teksten jo valideres på den side, formen poster imod  =)
Avatar billede erikjacobsen Ekspert
16. marts 2008 - 23:05 #13
Det kan være, det er mig, der har kigget for dybt i kartoffelgryden, men det er nok denne sætning jeg ikke forstår meningen med: "[...] men den fil jeg sender til ved da ikke hvad captcha koden skal være?"
Avatar billede showsource Seniormester
16. marts 2008 - 23:13 #14
En rimelig simpel måde at tjekke på, er at bruge sessions og include din adduser.php.

<?php
session_start();
$tjek = "navn";


if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_SESSION[$tjek],$_POST[$_SESSION[$tjek]])) {

include("adduser.php";

header("Location:somewhere");
exit;

}

$_SESSION[$tjek] = substr(md5(rand()), 0, 16); // tilfældigt navn

?>


html body m.m.

I din form har du så et hiddenfelt:
<input type="hidden" name="<?php echo $_SESSION[$tjek]; ?>" value="<?php echo md5(rand()); ?>">


I din adduser.php kan du lave et tjek a'la'

if(basename($_SERVER["PHP_SELF"]) == "adduser.php") {
exit;
}

if(!isset($_SESSION[$tjek],$_POST[$_SESSION[$tjek]])) {
exit;
}


behandl data............
Avatar billede showsource Seniormester
16. marts 2008 - 23:14 #15
kodefejl er gratis !!!!!
Avatar billede haolan Nybegynder
16. marts 2008 - 23:31 #16
jeg bruger i øvrigt smarty, hvilket gør brug af captcha ufatteligt besværligt :S
Avatar billede erikjacobsen Ekspert
16. marts 2008 - 23:49 #17
Brugen af smarty kan ikke gøre det spor mere besværligt at lave en captcha - det er bare et tamplate-system, som du styrer.

Men vi har stadig ikke fundet ud af hvad dit problem er. Scriptet fra showsource virker dog som overkill...
Avatar billede showsource Seniormester
17. marts 2008 - 07:32 #18
overkill ? Hvor ?
Avatar billede haolan Nybegynder
19. marts 2008 - 19:10 #19
Gennemtænkte bare ikk helt hvordan captche virkede.. så my bad, self er det løsningen :)
Jeg fandt et smarty plugin til captcha, hvilket gjorde det dejligt nemt :)

Du skriver at javascript kun er for brugeren og input også bør valideres i PHP.
Men hvis brugeren ikke kan gå videre uden at formen er udfyldt korrekt, er det så ikke overkill at lave validering i php bagefter hvis de alligevel ikke kan komme videre uden at skrive captcha koden rigtigt også?
Avatar billede olebole Juniormester
19. marts 2008 - 20:49 #20
Validering foretages i PHP, hvis captcha koden validerer - så evt. bruger-input sikres, inden de kommer i nærheden af databasen.

På den anden side er der ikke grund til, brugeren skal vente på besked fra serveren om, at han mangler et felt el.lign. Derfor kan det være en god idé at validere med JavaScript, inden formen submittes - men det sikrer ikke noget.

Med hensyn til sikkerhed kan det være en god idé at kikke på mysqli og prepared statements:
    http://dk2.php.net/manual/en/ref.mysqli.php

- og lidt flere eksempler:
    http://devzone.zend.com/node/view/id/686
Avatar billede olebole Juniormester
19. marts 2008 - 20:56 #21
- og når du validerer i PHP, må du ikke afvise ulovlige tegn - men i stedet godkende lovlige!

Du må ikke lave validering, hvor du forsøger at gætte, hvad brugeren kunne finde på at bruge af 'grimme' tegn ... det må du ikke tro, du har fantasi til  ;o)

Derimod skal du, hvergang du modtager input fra en bruger, opstille hvilke tegn, du vil godkende og forkaste data, der ikke _kun_ består af de tegn, du har tilladt for den pågældende variabel.
Avatar billede erikjacobsen Ekspert
19. marts 2008 - 21:31 #22
Og det var den tekniske forklaring, Ole kom med. Brugeren, derimod, er ligeglad med teknikken, og vil bare have, at hvad han nu finder på at skrive bliver registreret. Derfor skal man ikke afvise rimelige tegn som ulovlige. Det kan være enkelt-stroffer, fordi de "driller" i databasen, men man kan jo hedder O'Rourke. Eller man siger at navn kun må være a-zæøå, men glemmer dem, der hedder Schlüter. Eller man vil have at et telefonnummer skrives på en helt bestemt måde. Osv osv.
Avatar billede haolan Nybegynder
01. april 2008 - 12:40 #23
oki... er mysql_escape_string ikke nok til at sikre de tegn? :)
Avatar billede erikjacobsen Ekspert
01. april 2008 - 12:52 #24
Du får ikke mig til at garantere at noget er "nok". Men mysql_escape_string kan være en del af en løsning. Du skal også have styr på om PHP af sig selv sætter \-ere foran '-ere og lignende, når data kommer fra brugeren. Jeg vil foretrække at bruge http://php.net/mysqli
Avatar billede haolan Nybegynder
05. april 2008 - 18:20 #25
ok.. nu har jeg ihvertfald smidt noget captcha på.. Så laver jeg noget validering og kikker lidt på mysqli..

Mange tak for hjælpen :)


smid svar for points både olebole og erikjacobsen.. Det var en god lærerig hjælp :)
Avatar billede olebole Juniormester
05. april 2008 - 21:59 #26
Jeg er ret sikker på, Erik ikke er interesseret i points. Til gengæld er jeg ligeså sikker på, han straks hiver sin krydsslåningspen og kalender frem, når han hører, jeg med stor entusiasme tilslutter mig hans seneste to kommentarer  ;D
Avatar billede olebole Juniormester
05. april 2008 - 22:00 #27
- og tag dig ikke af, hvis du ikke forstod dén. Vi har været her i mange år og er nok lidt 'mærkelige'  ;o)
Avatar billede erikjacobsen Ekspert
05. april 2008 - 22:31 #28
Nemli' - ingen point til mig, tak. Jeg sætter et X.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester