Avatar billede kgp43 Nybegynder
24. februar 2004 - 15:07 Der er 37 kommentarer og
1 løsning

Sikkerhed ved upload a data

Hejsa,

Jeg har en db hvor brugeren har lov til at  uploade data. Mit spørgsmål er så hvordan jeg beskytter min database, så brugeren ikke kan skrive kommandoer i felterne. Jeg bruger splipslashes() - eller hvordan det nu staves, men er i tvivl om jeg bruger det rigtigt.

Jeg bruger funktionen, inden jeg smider data'ene ind i databasen. Er dette rigtigt?
Avatar billede bufferzone Praktikant
24. februar 2004 - 15:23 #1
Datavalidering, dette kan ikke siges nok. Du skal via javascript (og sikkert også andre teknologier) gennemvalidere hvert indtastningsfelt, så der kun kan indtastes det der skal og ikke andet. Jo hårdere du kan binde din validering op, jo bedre
Avatar billede kgp43 Nybegynder
24. februar 2004 - 17:14 #2
Det bliver lidt svært hvis jeg skal til at begrænse.

Hvordan virker stripslashes()?
Er det sikkerhed nok?
Avatar billede arne_v Ekspert
24. februar 2004 - 23:24 #3
Data skal ikke valideres client side men server side !
Avatar billede Slettet bruger
24. februar 2004 - 23:46 #4
Og stripslashes FJERNER databasebeskyttelse, så den skal du ikke køre, før du smider det i databasen.

Hvilken slags data snakker vi om? det kan være, vi kan finde på lidt metoder.

Det kan godt være en god ide også at lave datavalidering i javascript, så brugeren ikke skal vente på svar fra serveren, før han for mulighed for at rette de forkerte data. Men uanset hvilke valideringsmetoder du benytter på klientsiden SKAL data også valideres på serveren. Man kan jo ikke vide, om brugeren har fiflet med data (eller bare slået javascript fra).

Og husk: Sikkerhed ER besværligt, men nødvendigt.
Avatar billede kgp43 Nybegynder
25. februar 2004 - 06:24 #5
Jeg snakker om tekst og tal (drowdown og textfields).
Jeg har hørt at man kan sætte "/" omkring alt input og fjerne det igen når man tager det ud. Dette skulle forhindre brugeren i at skrive mysql kommandoer i textfield'ene. Men ved ikke hvordan dette anvendes.
Avatar billede Slettet bruger
25. februar 2004 - 09:25 #6
Når du modtager data, som skal indsættes i en database, sker følgende:

- PHP får oplysninger om felternes indhold og cookie-indhold fra webserveren.
- PHP kører måske addslashes() på brugerdata. [Se note 1]
- PHP putter data i variabler, der kan bruges af dit script.
  * $_GET får data fra adressen (og formularer med method='get')
  * $_POST får data fra formularer med method='post'
  * $_COOKIE får data fra cookies.
  * $_REQUEST får data fra de tre ovennævnte. [Se note 2]
  * Måske bliver data også puttet i variable som f.eks. $navn [Se note 2 og 3]
- Dit script starter og du sætter ind i databasen.

Forestil dig følgende login-situation:
  * Formularen havde to felter: navn og password
  * Der er IKKE kørt addslashes(), eller du HAR kørt stripslashes()
  * SELECT brugerid FROM tabel WHERE navn='$navn' and password='$password'
  * $navn="admin" og password="glup' OR '' = '" giver følgende:
    SELECT brugerid FROM tabel WHERE navn='admin' AND password='glup' OR '' = ''

Hvis du har en bruger, der hedder admin, er personen nu logget ind.

Hvis du havde slashes i variablerne, ville MySQL have ignoreret \' så den ville have forsøgt at finde en bruger med passwordet glup' OR '' = ', da din query så havde set således ud:

SELECT brugerid FROM tabel WHERE navn='admin' AND password='glup\' OR \'\' = \''

Når du henter data ud fra tabellen igen, kan det også være, at der bliver kørt en automatisk addslashes på dem[Se note 4]. Den skal du kun fjerne med stripslashes, hvis du ikke vil putte indholdet i database igen. Jeg vil foreslå at du kun hjerner dem, lige når du udskriver data.

Noter:

1)
Dette kan ændres i php.ini. I dit script, kan du bruge get_magic_quotes_gpc() for at finde ud af om det er slået til, så du kan lave scriptet, så det virker både på servere med og uden automatisk addslashes().

2)
Hvis det skulle ske, at variable fra flere steder har samme navn, er det enten variables_order (i nyere udgave) eller gpc_order (i ældre udgaver), der bestemmer hvilke der kommer igennem.

3)
Hvis register_globals er slået til. Dette anbefales ikke, og den har som standard været slået fra i nyere PHP-versioner.

4) Tilsvarende til note 1, findes der funktionen get_magic_quotes_runtime() som kan fortælle dig om dette er aktiveret.
Avatar billede Slettet bruger
25. februar 2004 - 09:28 #7
For lige at uddybe mit login-eksempel:

Hvis MySQL ser \' i en query, vil den selv fjerne \ og sætte ' ind i feltet.

\ betyder bare: Næste tegn skal ikke opfattes normalt, men bare indsættes som det er. Den bruges også i PHP, hvis du vil bruge en " inde i en streng, hvor der er " uden om.
Avatar billede kgp43 Nybegynder
25. februar 2004 - 10:13 #8
wow, mega langt indlæg der :)

Jeg tror ikke jeg har adgang til php.ini, da jeg har et alm. webhotel.
Kan man ikke bare som standard bruge addslashes(), hvergang man uploader data til db'en, og så bruge striplashes() får man henter det ud igen?
Avatar billede Slettet bruger
25. februar 2004 - 10:25 #9
Jeg vil foreslå, at du bruger noget i stil med følgende funktion, der kun laver addslashes, hvis det ikke allerede er gjort.

function my_addslashes($streng){
  return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

Tilsvarende kan du efter at have hentet fra databasen bruge en funktion i stil med følgende, som kun laver stripslashes, hvis dit databaseudtræk laver addslashes:

function my_stripslashes($streng){
  return get_magic_quotes_runtime()?stripslashes($streng):$streng;
}

Denne stripslashes er det nok en god ide at bruge lige før, du eventuelt manipulerer output med striptags(), nl2br() eller lignende.

Fordelen ved at bruge disse funktioner istedet for bare at kalde addslashes eller stripslashes normalt er, at så virker dit script stadig hvis du skifter til et andet hotel med andre indstillinger, eller hvis dit hotel pludselig laver om på indstillingerne.

Ja, indlægget var egentlig ganske langt. Burde nok lave det til en artikel.
Avatar billede kgp43 Nybegynder
25. februar 2004 - 10:35 #10
"Ja, indlægget var egentlig ganske langt. Burde nok lave det til en artikel."

Vil være en god idé, har søgt forholdsvis længe efter info relateret til stripslashes (uden resultat). Og så tilføje de to funktioner :)

Jeg takker for dit svar, kan du ikke lige have "et svar" så du kan få point.
Avatar billede Slettet bruger
25. februar 2004 - 10:39 #11
Jo, kommer her.
Avatar billede Slettet bruger
25. februar 2004 - 11:05 #12
Avatar billede kgp43 Nybegynder
25. februar 2004 - 11:31 #13
hovsa, så har jeg da vist misforstået dig.

Man kan altså bruge de to funktioner i stedet for addslashes() og stripslashes()?

Dvs.

----------------
function my_addslashes($streng){
  return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

- Bruger jeg lige inden dataene bliver uploadet til databasen?

-----
function my_stripslashes($streng){
  return get_magic_quotes_runtime()?stripslashes($streng):$streng;
}

- Bruger jeg når jeg har hentet data ud fra databasen?
Avatar billede Slettet bruger
25. februar 2004 - 11:45 #14
Nemlig.

Bemærk dog, at Hvis du har hentet data ud fra databasen og fjernet slashes fra dem, skal du bruge en normal addslashes, før du sætter ind i en database igen.
Avatar billede kgp43 Nybegynder
25. februar 2004 - 11:59 #15
Okay, det vil jeg lige huske :)

Men er det ikke dét den første funktion gør?
- Hvis der ikke er slashes så skal de filføjes.
Avatar billede Slettet bruger
25. februar 2004 - 12:19 #16
Den første funktion tilføjer slashes, hvis data fra formularer ikke automatisk får tilføjet slashes.

Det kan du ikke bruge til meget, hvis dataene ikke kommer fra en formular men fra database. Hvis vi forestiller os, at du har hentet data fra databasen og selv fjernet slashes (måske med funktion nummer 2), og derefter bruger my_addslashes() på dem, vil der normalt ikke blive lavet slashes, da formulardata normalt får slashes sat.
Avatar billede kgp43 Nybegynder
25. februar 2004 - 13:12 #17
Alle mine output fra db'en bliver indsat i en ny formular (redigering).
Jeg har dog forstået hvordan det virker nu :)
Avatar billede kgp43 Nybegynder
07. marts 2004 - 11:48 #18
Håber at du der dette her sandbox :)

Jeg er netop gået igang med at ændre min kode, så jeg får de addslashes med.
Har flere variabler og troede bare jeg kunne gøre det på denne måde, men den kommer med en fejl.


$brand = &$HTTP_POST_VARS['brand'];
$brand_link = &$HTTP_POST_VARS['brand_link'];
$status = &$HTTP_POST_VARS['status'];

function my_addslashes($brand){
  return get_magic_quotes_gpc()?$brand:addslashes($brand);
}

function my_addslashes($brand_link){
  return get_magic_quotes_gpc()?$brand_link:addslashes($brand_link);
}

function my_addslashes($status){
  return get_magic_quotes_gpc()?$status:addslashes($status);
}

Fejl:
Fatal error: Cannot redeclare my_addslashes() (previously declared in /home/fedtmco/public_html/mytackle/admin/brands/add_ok.php:67) in /home/fedtmco/public_html/mytackle/admin/brands/add_ok.php on line 71
Avatar billede kgp43 Nybegynder
07. marts 2004 - 11:50 #19
Måske det skal gøres på denne måde?

$brand = &$HTTP_POST_VARS['brand'];
$brand_link = &$HTTP_POST_VARS['brand_link'];
$status = &$HTTP_POST_VARS['status'];

function my_addslashes($streng){
  return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

$brand = my_addslashes($brand);
$link = my_addslashes($link);
$status = my_addslashes($status);
Avatar billede kgp43 Nybegynder
07. marts 2004 - 11:51 #20
Den kommer ikke med nogen fejl (ved det sidste forslag), men felterne i min tabel/række er tomme nu.
Avatar billede Slettet bruger
07. marts 2004 - 14:14 #21
Prøv at rette til:

$brand = $HTTP_POST_VARS['brand'];
$brand_link = $HTTP_POST_VARS['brand_link'];
$status = $HTTP_POST_VARS['status'];

function my_addslashes($streng){
  return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

$brand = my_addslashes($brand);
$link = my_addslashes($link);
$status = my_addslashes($status);

Derudover vil jeg foreslå at bruge $_POST i stedet for $HTTP_POST_VARS.

Men ja, selve funktionen skal bare stå et sted, og så bruger man den på den måde, som du gør i de nederste linier. Normalt vil man skrive selve funktionen i starten eller i en include-fil.
Avatar billede kgp43 Nybegynder
07. marts 2004 - 14:54 #22
Du mener at man indsætter funktionen i toppen af siden? lige efter head?
Avatar billede Slettet bruger
07. marts 2004 - 15:42 #23
Ja. Normalt er det bare denne slags funktioner, som man kan få brug for på flere forskellige sider, og så er det smartere at have en separat fil, som man inkluderer.

Jeg har for eksempel en fil, der ser således ud:

<?php

function pageheader($title,$extrastyle=''){
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">

    <html>
    <head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title><?php echo $title; ?></title>
  <style type="text/css" media="screen">@import "menus.css";</style>


<?php if (!empty($extrastyle)) {echo "<link href='$extrastyle' rel='stylesheet' type='text/css'>";} ?>
</head>
    <body>
<div id='logo'><img src="fedmil_files/minilogo.jpg" alt="logo"></div>
<div class='content'><h1><?php echo $title; ?> </h1></div>
?>
}

function pagefooter(){
    echo "</body></html>";
}

?>
Avatar billede Slettet bruger
07. marts 2004 - 15:45 #24
Den fil henter jeg ind på alle mine sider:

<?php

require_once("funktioner.php");

// her begynder min kode.

pageheader("Sidetitel");

// Her udskrives selve sideindholdet

pagefooter();
?>
Avatar billede kgp43 Nybegynder
09. marts 2004 - 17:21 #25
Okay, ser ikke ud til at det virker, eller også tror jeg det virker på en anden måde.
Hvordan skal jeg teste om det virker? Og skal funktionen (addslashes funktionen) bruges ved alle db input? (også når data ligges op i db'en)
Avatar billede Slettet bruger
09. marts 2004 - 19:11 #26
Det er kun nødvendigt at bruge addslashes-funktionen, når man ikke er sikker på indholdet af de data, man sætter ind. Hvis du er i tvivl om, om en variabel måske indeholder anførselstegn, så skal du bruge addslashes.

Du kan teste om det virker på denne måde:

echo my_addslashes("I'm just testing");

Hvis den virker, så udskrives der: I\'m just testing
Avatar billede kgp43 Nybegynder
10. marts 2004 - 17:33 #27
weird.

Jeg lavede en test fil, og indsatta denne kode:

--------
<?php
function my_addslashes($streng){
  return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

echo my_addslashes("I'm just testing");
?>
--------

Den udskriver ikke "I\'m just testing" men "I'm just testing"
Avatar billede Slettet bruger
10. marts 2004 - 17:46 #28
Undskyld. Jeg var forvirret, da jeg skrev 09/03-2004 19:11:04 og jeg fik dig revet med i forvirringen.

Som jeg havde skrevet tidligere (25/02-2004 11:45:11) virker funktionen kun efter hensigten, hvis man bruger den på data, der kommer direkte fra en formular (eller andet brugerdata). Funktionen gør nemlig det, at den KUN tilføjer slashes, hvis PHP ikke er sat til automatisk at tilføje dem. Hvis du bruger my_addslashes på andre ting, vil der ikke blive tilføjet slashes til dem, når PHP er sat til at sætte slashes på formularindhold - og det er PHP i dit tilfælde, så koden gør nøjagtig hvad den får besked på, nemlig skriver strengen uden slashes.
Avatar billede kgp43 Nybegynder
10. marts 2004 - 20:55 #29
Kan man ikke se slashes i mysql?

Jeg har tilføjet din kode i forbindelse med en form. Hereftet submittet følgende tekst "i'm gone fishing" til mysql. Jeg troede at dette blev ændret til "i\'m gone fishing" i db'en? (dette er ikke tilfældet)
Avatar billede Slettet bruger
11. marts 2004 - 02:35 #30
Brokker mysql sig? Det vil den nemlig normalt gøre, hvis den får en query der ser således ud:

INSERT INTO tabel (tekst) VALUES ('i'm gone fishing')

Hvis den til gengæld får dette:

INSERT INTO tabel (tekst) VALUES ('i\'m gone fishing')

vil den pænt gøre som den skal, men bemærk at \-tegnet forsvinder under indsættelsen. \ betyder bare, at den efterfølgende ' ikke betyder at strengen er slut, så mysql skal fjerne \ og indsætte '

Når du derefter henter noget ud af databasen igen er det kun hvis magic_quotes_runtime er slået til, at der bliver tilføjet en \ igen.
Avatar billede kgp43 Nybegynder
11. marts 2004 - 07:00 #31
mysql kommer ikke med nogen fejl, men indsætter "i'm gone fishing", uden problemer.
Er der ikke en måde jeg kan teste om det virker? Troede at det kunne ses i mysql.

Jeg er ikke engang sikker på at jeg har lavet en fejl, men vil være sikker på at jeg har gjort det rigtigt.
Avatar billede Slettet bruger
11. marts 2004 - 12:38 #32
Prøv at udskrive din query-streng lige inden du sætter ind i databasen.
Avatar billede kgp43 Nybegynder
11. marts 2004 - 16:33 #33
det virker jo :D
"i\'m gone fishing"

Kan det passe at php, selv fjerne slashes når, de hentes ud fra db'en og postes på en side? Jeg poster nemlig "i'm gone fishing", uden brug at din anden funktion.
Avatar billede Slettet bruger
11. marts 2004 - 23:53 #34
Det kan godt være, at serveren ikke er indstillet til at sætte slashes på noget fra databasen.

En god metafor er at sammenligne slashes med bremseklodser. De forsvinder, når de bliver brugt. ;-) Det vil sige, at slashen i "i\'m gone fishing" bliver "opbrugt", når teksten bliver sat ind i databasen, og hvis PHP så ikke sætter en ny, når den bliver hentet ud igen, er der ikke nogen.
Avatar billede kgp43 Nybegynder
12. marts 2004 - 06:47 #35
smart nok :)

Dvs. at jeg skal bruge funktionen hvergang der puttes NYT data i databasen? da mysql automatisk fjerner slashes (når det er sikkert)
Avatar billede Slettet bruger
12. marts 2004 - 12:32 #36
Ja, du skal bruge en addslashes hver gang du indsætter data i databasen, som måske kan indeholde en ' uden \ foran.

Hvis data kommer fra POST, GET eller en cookie, kan du bruge myaddslashes.
Hvis data kommer fra databasen (og magic_quotes_runtime ikke er aktiv) skal du bruge en normal addslashes.
Hvis du selv har brugt en stripslashes, skal du bruge en normal addslashes.
Hvis data er lavet af dit script, skal du bruge en normal addslashes.

Faktisk begynder dette at være så kompliceret, når man virkeligt tænker over det, at en anden indgansvinkel måske kan være nyttig i situationer, hvor alle de forskellige typer af data kan være blandet mellem hinanden.

Den anden metode går simpelthen ud på, at man sørger for altid at fjerne slashes på alt data fra brugere og databaser, når de bliver hentet, og at man derefter altid kører en normal addslashes på alt data der bliver puttet i database.
Avatar billede kgp43 Nybegynder
12. marts 2004 - 13:49 #37
Okay, det vil så betyde at jeg glemmer din funktion?
I stedet for benytter jeg så stripslashes og addslashes (ved upload af data).
Avatar billede kgp43 Nybegynder
12. marts 2004 - 13:50 #38
tror jeg kan se ideen nu :)

takker endnu engang for din hjælp.
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
Computerworld tilbyder specialiserede kurser i database-management

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