Jump to content
Sign in to follow this  
muffe

Skjekke variabler

Recommended Posts

Har en side med et svært skjema. Verdiene i dette skjemaet skal inn i en mySQL spørring. Hvordan skjekker jeg det for ondsinnet kode? Er det mulig å skjekke HELE $_POST før det "deles" opp i mindre variabler?

 

De tegnene som er gyldige er a-z, A-Z, æ, ø, å, Æ, Ø, Å, 0-9, samt punktum og komma.

 

Hvordan gjøre dette enkelst mulig? $_POST deles opp i 23 mindr variabler, er det mulig å skjekke alle disse 23 i samme operasjon?

 

Håper dere skjønte hva jeg mente. På forhånd takk.

Share this post


Link to post

$_POST $_GET $_REQUEST $_COOKIE $_SESSION $_SERVER osv. er arrays.

Dvs. du kan bare bruke foreach() for å sjekke variablene.

Uansett så burde du sjekke variablene med mysq_escape_string() da er den trygg å sette inn i mysql.

 

Her en en måte du kan sjekke etter tall og bokstaver:

 

foreach($_POST as $navn => $verdi){

if(eregi("^[a-zæøå0-9]$",$verdi)){

$OkVariabel[$navn] = $verdi;

}

}

 

Da ineholder $OkVariabel kun verdier som består av bokstaver og tall. $_POST['felt1'] blir lagret i $OkVariabel['felt1'] dersom den er ok.

 

Hvis du ikke vil validere på den måten, men bare sette verdiene inn, holder det å bruke mysql_escape_string(). F.eks.:

INSERT INTO tabell (felt1, felt2...) VALUES ('".mysql_escape_string($_POST['felt1'])."', '".mysql_escape_string($_POST['felt2'])."'...)

 

 

EDIT:

 

$_POST, $_GET og $_COOKIE variablene finnes i $_REQUEST.

Dvs. vet du ikke om skjemaet bruker post eller get - eller det kan variere, er det ofte enklere å bare bruke $_REQUEST.

Edited by ????????

Share this post


Link to post

Hørt om PHP manualen?

http://no2.php.net/manual/en/function.mysq...cape-string.php

:p

 

 

Den escaper tegn som ' og " slik at en bruker ikke kan avsluttet din sql spørring og sette inn sin egen etter din.

 

Problemet er dersom en bruker f.eks. setter inn '); og lager en egen spørring i et felt.

 

F.eks. i feltet navn skriver en bruker:

'); GRANT ALL PRIVILEGES ON ...;

 

Og spørringen din ser slik ut:

 

INSERT INTO tabell VALUES('".$_POST['navn']."');

Der $_POST['navn'] settes inn avsluttes din spørring, så kjøres spørringen brukeren har lagt inn - som oppretter en ny bruker i databasen.

 

mysql_escape_string() bytter da ut ' med \' (slik at det blir et tegn og ikke avslutter spørrignen din);

Share this post


Link to post

Har et login-script jeg tenkte å begynne med (få variabler osv). Men jeg får en feilmelding:

 

Warning: Invalid argument supplied for foreach() in E:\inetpub\wwwroot\grimstad.seilforening\treningsdagbok\login.php on line 13

Brukernavnet og/eller passordet er feil. Vennligst prøv igjen.PHP Warning: Invalid argument supplied for foreach() in E:\inetpub\wwwroot\grimstad.seilforening\treningsdagbok\login.php on line 13

 

Her er scriptet:

?php

error_reporting (E_ALL ^ E_NOTICE);

session_start();

foreach($_POST as $navn => $verdi){
if(eregi("^[a-zæøå0-9]$",$verdi)){
$INPUT[$navn] = $verdi;
}
}

foreach($INPUT as $navn => $verdi){
mysql_escape_string($navn);
$OKINPUT[$navn] = $verdi;
}

$id = $OKINPUT['id'];
$password = $OKINPUT['Passwd'];

include('connect.php');

$query_1 = "SELECT * FROM users WHERE id='$id' and Passwd='".md5($password)."'";
$result_1 = mysql_query($query_1) or die ("Could not execute query : $query." . mysql_error());

if (mysql_num_rows($result_1) == 0) {

$query_2 = "SELECT * FROM admins WHERE id='$id' and Passwd='".md5($password)."'";
$result_2= mysql_query($query_2) or die ("Could not execute query : $query." . mysql_error());

if (mysql_num_rows($result_2) == 0) {

echo('Brukernavnet og/eller passordet er feil. Vennligst prøv igjen.');

}

else {

$r=mysql_fetch_array($result_2);
$login_username=$r['id'];
$_SESSION['login_username'] = $login_username;
$_SESSION['admin'] = true;
Header("Location: main.php");
exit();

}
}

else {

$r=mysql_fetch_array($result_1);
$login_username=$r['id'];
$_SESSION['login_username'] = $login_username;
$_SESSION['admin'] = false;
Header("Location: main.php");
exit();
}

  /* Lukker forbindelse */
  mysql_close($link);

?>

 

Har jeg forstått foreach() riktig med hennsyn til mysql_escape_string()? Kan det brukes på denne måten?

 

På forhånd takk for alle svar.

 

Edit: Trykkleif

Edit2: Trykkleif 2

Edited by muffe

Share this post


Link to post

Har endret litt på første del:

 

<?php

error_reporting (E_ALL ^ E_NOTICE);

session_start();

foreach($_POST as $navn => $verdi){
if(eregi("^[a-zæøå0-9]$",$verdi)){
$INPUT[$navn] = $verdi;
}
}

foreach($INPUT as $navn => $verdi){
$esc_verdi = mysql_escape_string($verdi);
$OKINPUT[$navn] = $esc_verdi;
}

$id = $OKINPUT['id'];
$password = $OKINPUT['Passwd'];

 

Men samme feil fremdeles.

Share this post


Link to post

Da legger du det til.

 

"^[a-zæøå0-9\.,]+$"

 

Du kan legge til alle de tegnene du trenger, bare pass på at du må escape noen. Hvis du forsøker å legge til noen tegn som du ikke får til å fungere sett inn \ foran tegnet.

 

Skal det være tillatt med mellomrom kan du legge til det også.

 

Skriver litt om funksjonen her:

 

^ betyr at variabelen må starte med det som kommer etter

eregi("^a", $variabel)
// variabelen må starte med a
// true: $variabel = "abc"
// false: $variabel = "cba" 

 

$ betyr at den må slutte med tegnet foran

eregi("a$", $variabel)
// variabelen slutte med a
// true: $variabel = "cba"
// false: $variabel = "abc" 

 

[] brukes til å definere flere tegn sammen

eregi("[abcdefghijklmnopqrstuvwxyzæøå]", $variabel)
// variabelen må inneholde en bokstav som er definert ovenfor
// true: $variabel = "a"
// false: $variabel = "1" 
// Du kan forkorte det til [a-zæøå]
// legg merke til at æøå burde defineres for seg selv

 

* etter definerte tegn betyr at det må være 0 eller flere

eregi("^[a-zæøå]*$", $variabel)
// variabelen inneholder null eller flere bokstav som er definert ovenfor
// siden ^ og $ er tatt med kan den kun inneholde en av de bokstavene
// true: $variabel = "a"
// false: $variabel = "1a" 
// legg merke til at æøå burde defineres for seg selv

 

+ brukes for å kreve at det er en eller flere

eregi("^[a-zæøå]+$", $variabel)
// true: $variabel = "aaaa"
// false: $variabel = "" 
// Du kan forkorte det til [a-zæøå]
// legg merke til at æøå burde defineres for seg selv

 

? brukes for å sjekke om det er null eller et tegn

eregi("^[a-zæøå]?$", $variabel)
// true: $variabel = "a" eller ""
// false: $variabel = "aaaa"
// Du kan forkorte det til [a-zæøå]
// legg merke til at æøå burde defineres for seg selv

 

Du kan også bruke { } for å definere et bestemt antall:

eregi("^a{2}$", $variabel) - betyr at det må være "aa"

NB: som nevnt tidligere er ^ og $ kun for å passe på at variablen begynner og slutter med de definerte tegnene. Skal du kun sjekke om det er to a'er bruker du "a{2}"

 

a{5,} betyr minst fem a'er

a{5,10} betry at det må være mellom 5 og 10 a'er

 

. betyr hvilket som helts teng

.{2} betyr to tegn

 

| betyr eller

a|b betyr derfor a eller b

 

 

( ) brukes for å definere hele deler

(ab)+ betyr en eller flere ab

True: abab

False: abbb

 

siden jeg brukte eregi (case insensitive) sjekker den både etter store og små bokstaver.

Hvis du f.eks. bruker ereg må du også definere om du ønsker store eller små bokstaver.

 

[a-zæøåA-ZÆØÅ] betyr store og små bokstaver

[A-ZÆØÅ] betyr kun store bokstaver

Edited by ????????

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...