Avatar billede nwn Nybegynder
21. januar 2009 - 18:45 Der er 11 kommentarer

Sikkerhed til sine PHP/MySQL sider

Hej.

Jeg har læst rundt omkring på forskellige sider, at man er godt på vej mod sikkerhed, hvis man f.eks anvender mysql_real_escape_string. Nu vil jeg gerne en gang for alle, have slået fast, hvad der skal til, for at ens side er sikker.

Hvis man lader sine besøgende indtaste data i et felt, og den data så tjekkes i databasen, hvordan sikre man så, at dataen på ingen måde kan skade?

Er ens side sikret, hvis man anvender mysql_real_escape_string på _ALLE_ indkomne data, dvs: post, get, file, cookie osv?

Er der en her der virkelig kan fortælle, hvordan man sikre sin side?
Avatar billede olebole Juniormester
21. januar 2009 - 19:07 #1
<ole>

Brug mysqli og prepared statements:
    http://dk2.php.net/manual/en/book.mysqli.php

Begynd evt. med eksemplerne her:
    http://dk2.php.net/manual/en/mysqli-stmt.prepare.php

/mvh
</bole>
Avatar billede nwn Nybegynder
21. januar 2009 - 19:16 #2
Det virker lidt kompliceret. Kan du give lidt forklaring og eksempler på dansk?
Avatar billede erikjacobsen Ekspert
21. januar 2009 - 19:54 #3
Det er totalt formålsløst at forsøge at sikre data mod sql-problemer hvor folk taster dem ind. Det var et hack i PHP i sin tid, men det har udlevet sig, og nogen får sig en gevaldig overraskelse når de får smagt på PHP6.

Sql-problemer skal løses ved sql-delen, sjovt nok. Derfor er der ingen anden vej, end at kigge på de links Ole viser dig. Og nej, det forstås nok ikke på 5 minutter, så giv dig den tid, der skal til.

Og hvis du ikke gider der, så laver du bare usikre systemer som alle andre...

Sikkerhed er forøvrigt ikke kun det der med sql-injection.
Avatar billede olebole Juniormester
21. januar 2009 - 22:44 #4
- eller at trække sig tilbage i tide!  ;o)

nwn >> Jeg har prøvet at omskrive eksemplet en lille smule med danske kommentarer, samt (meget vigtigt!) indsat et par links. Jeg ved, det kan virke overvældende, men hvis du kikker på dokumentationen til de forskellige metoder, du bruger, begynder det langsomt (og så lige pludselig hurtigt) at give mening.
Samtidig bliver du dus med oversigterne over klasserne og metoderne, hvilket også er med til at lægge indlæringskurven ned.

Det er ikke sålænge siden, denne vrisne, aldrende mandsling kastede sig over mysqli (i'et står iøvrigt for Improved). Det virkede lige umiddelbart som at skulle begynde helt forfra, hvilket var til at få lange poser under hofterne af! Jeg fandt dog hurtigt ud af, at det er let at lære og en drøm at bruge.

Tag det som et godt veninderåd: Prøv det!  =)
Avatar billede olebole Juniormester
21. januar 2009 - 22:44 #5
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");

/* Tjek forbindelsen og skriv en evt. fejl */
if ( mysqli_connect_errno() ) die ( mysqli_connect_error() );

/* Et navn, vi skal finde info om i DB */
$user = "olebole";

/* Opret et prepared statement objekt
( Se evt: http://dk2.php.net/manual/en/mysqli.stmt-init.php ) */
$stmt =  $mysqli->stmt_init();

/* Forbered database kaldet. De steder, vi vil bruge variabler i kaldet, indsættes et ? */
$succes = $stmt->prepare("SELECT id, sex, birth FROM users WHERE u_name=?");

/* Hvis det gav mening */
if ($succes) {
    /* Bind parametre. Vi skal bruge variablen $user, som vi bestemmer, skal være en streng.
    ( Se om typerne her: http://dk2.php.net/manual/en/mysqli-stmt.bind-param.php ) */
    $stmt->bind_param("s", $user);

    /* Kør forespørgslen*/
    $stmt->execute();

    /* Bind resultaterne til variabler */
    $stmt->bind_result($user_id, $user_sex, $user_date_of_birth);

    /* Hent rækken fra resultatet */
    $stmt->fetch();

    print "Brugeren ".$user." har id: ".$user_id."<br>";
    print "Brugeren ".$user."'s køn er: ".$user_sex."<br>";
    print "Brugeren ".$user." er født den: ".$user_date_of_birth."<br>";

    /* Luk statement */
    $stmt->close();
}

/* Luk forbindelsen til databasen */
$mysqli->close();
?>
Avatar billede olebole Juniormester
21. januar 2009 - 22:46 #6
Hov, jeg glemte da et link til metoden 'bind_result':
    http://dk2.php.net/manual/en/mysqli-stmt.bind-result.php
Avatar billede olebole Juniormester
21. januar 2009 - 22:51 #7
Nu er eksemplet ikke så velvalgt, men lad os alligevel forudsætte, der kan være mange brugere med navnet 'olebole' (f*cking copycats!), så kunne du skrive:

    /* Bind resultaterne til variabler */
    $stmt->bind_result($user_id, $user_sex, $user_date_of_birth);

    /* Hent rækker fra resultatet */
    while( $stmt->fetch() ) {
        print "<p>";
        print "Brugeren ".$user." har id: ".$user_id."<br>";
        print "Brugeren ".$user."'s køn er: ".$user_sex."<br>";
        print "Brugeren ".$user." er født den: ".$user_date_of_birth;
        print "</p>";
    }
   
    /* Luk statement */
    $stmt->close();
Avatar billede nwn Nybegynder
22. januar 2009 - 07:10 #8
Okay, jeg vil lige kigge nærmere på det, når jeg kommer hjem til spisetid.

Men jeg kan da se, man connecter til databasen på en anden måde, henter tingene ned på en anden måde osv. Er det denne måde man bør vende sig til, fremfor den mere normale?
Avatar billede j4k0b Nybegynder
22. januar 2009 - 12:25 #9
Der er rigtig mange ting som kan gøre din hjemmeside usikker. SQL injections er blot én af dem.

Prøv og tag et kik på denne artikel:
http://news.bbc.co.uk/2/hi/technology/7824939.stm


De største programmeringsfej (i rækkefølge):
CWE-20:Improper Input Validation
CWE-116:Improper Encoding or Escaping of Output
CWE-89:Failure to Preserve SQL Query Structure
CWE-79:Failure to Preserve Web Page Structure
CWE-78:Failure to Preserve OS Command Structure
CWE-319:Cleartext Transmission of Sensitive Information
CWE-352:Cross-Site Request Forgery
CWE-362:Race Condition
CWE-209:Error Message Information Leak
CWE-119:Failure to Constrain Operations within the Bounds of a Memory Buffer
CWE-642:External Control of Critical State Data
CWE-73:External Control of File Name or Path
CWE-426:Untrusted Search Path
CWE-94:Failure to Control Generation of Code
CWE-494:Download of Code Without Integrity Check
CWE-404:Improper Resource Shutdown or Release
CWE-665:Improper Initialization
CWE-682:Incorrect Calculation
CWE-285:Improper Access Control
CWE-327:Use of a Broken or Risky Cryptographic Algorithm
CWE-259:Hard-Coded Password
CWE-732:Insecure Permission Assignment for Critical Resource
CWE-330:Use of Insufficiently Random Values
CWE-250:Execution with Unnecessary Privileges
CWE-602:Client-Side Enforcement of Server-Side Security
Source: SANS Institute
Avatar billede olebole Juniormester
22. januar 2009 - 17:37 #10
nwn >> Ja, det er nogle nye klasser, som derfor også anvendes på lidt andre måder. Det er dog ret let at lære, og der er ingen tvivl om, det er værd at lære så hutigt som muligt.

I slutningen af 90'erne var sites, opbygget i et utal af nestede frames - og med et hav af nestede tabeller og hundredevis af transparente giffer i hoveddokumentet - 'den mere normale måde' at gøre tingene på. I dag har de fremgangsmåder kun historisk interesse  =)
Avatar billede nwn Nybegynder
23. januar 2009 - 20:25 #11
Jeg må prøve at få det lært, og vende mig til det. Vil du smide et svar Ole?
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