|
| 2 spørgsmål om sesions Fra : Nederbasse |
Dato : 09-05-05 10:42 |
|
Hej
Jeg er ved at lave et noget login som bruger sessions og vil gerne have
echo'et min session variabel
jeg vil gerne have personid som session variabel, denne værdi skal hentes
fra en Mysql db.
Personid skal bruger over flere sider
min login check side:
$result = mysql_query("SELECT id, username, password FROM bruger WHERE
username =
'".$_POST['brugernavn']."' AND password = '".$_POST['password']."'") or die
(mysql_error());
if ($antal_raekker=mysql_num_rows($result)>0){
$_SESSION['logget_ind']=1;
$_SESSION['id'] = $result["id"];
header ("Location: forside.php");
og forside hvor heg gerne vil se om id bliver hentet:
echo $_SESSION['id'];
problemet er at der ikke bliver skrevet noget
Andet spørgsmål:
Brugerne skal svare på nogle spørgsmål over en 4-5 sider og til sidst skal
svarebe sættes ind i datebasen.
Skal der laves en session for hver svar eller hvordan laves dette nemmest ?
LarsN
| |
Zilla (09-05-2005)
| Kommentar Fra : Zilla |
Dato : 09-05-05 11:01 |
|
Nederbasse wrote:
[snip]
> $result = mysql_query("SELECT id, username, password FROM bruger WHERE
> username =
> '".$_POST['brugernavn']."' AND password = '".$_POST['password']."'") or die
> (mysql_error());
For det første så er der en ret alvorlig fejl i ovenstående. Her kan
brugeren nemlig lave såkaldte sql injection attacks. Hvis du ikke ved
hvad det er så google det. Løsningen er at køre $_POST[]-variablerne en
tur gennem mysql_escape_string(). Se her: www.php.net/mysql_escape_string
> if ($antal_raekker=mysql_num_rows($result)>0){
> $_SESSION['logget_ind']=1;
> $_SESSION['id'] = $result["id"];
> header ("Location: forside.php");
>
> og forside hvor heg gerne vil se om id bliver hentet:
> echo $_SESSION['id'];
> problemet er at der ikke bliver skrevet noget
For det andet: Har du husket at starte sessions på begge sider med
session_start()? Hvis ikke er det højst sandsynligt det der er i vejen.
> Andet spørgsmål:
> Brugerne skal svare på nogle spørgsmål over en 4-5 sider og til sidst skal
> svarebe sættes ind i datebasen.
> Skal der laves en session for hver svar eller hvordan laves dette nemmest ?
Du kan indsætte variablerne fra de tidligere sider som skjulte inputs:
echo "<input type='hidden' name='spørgsmål1' value='" .
$_POST[spørgsmål1] . '">
osv. Hvis disse spørgsmål skal gemmes i databasen så skal du også køre
dem igennem mysql_escape_string().
Zilla.
| |
Nederbasse (09-05-2005)
| Kommentar Fra : Nederbasse |
Dato : 09-05-05 14:54 |
|
SNIP
>
> For det andet: Har du husket at starte sessions på begge sider med
> session_start()? Hvis ikke er det højst sandsynligt det der er i vejen.
>
>
Der er session_start() på alle sider
LarsN
| |
Peter Brodersen (09-05-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 09-05-05 15:51 |
|
On Mon, 09 May 2005 12:00:58 +0200, Zilla <mail.is.not@an.option>
wrote:
>For det første så er der en ret alvorlig fejl i ovenstående. Her kan
>brugeren nemlig lave såkaldte sql injection attacks. Hvis du ikke ved
>hvad det er så google det. Løsningen er at køre $_POST[]-variablerne en
>tur gennem mysql_escape_string(). Se her: www.php.net/mysql_escape_string
Til gengæld taler sandsynligheden også for at hvis han ikke ved, hvad
det er, så er der tale om en default php-opsætning, hvor der bruges
magic_quotes_gpc.
--
- Peter Brodersen
| |
Zilla (10-05-2005)
| Kommentar Fra : Zilla |
Dato : 10-05-05 20:03 |
|
Peter Brodersen wrote:
[snip]
> Til gengæld taler sandsynligheden også for at hvis han ikke ved, hvad
> det er, så er der tale om en default php-opsætning, hvor der bruges
> magic_quotes_gpc.
Det er rigtigt, men det er godt at vide dette, så man gør det rigtigt.
Når det er sagt så kan det give nogle uventede resultater ved at bruge
mysql_escape_string() når magic quotes er slået til. Her kan man nemlig
komme ud for at en streng som allerede er "escaped" pga. magic quotes
bliver "escaped" endnu en gang. Eks.:
Streng som brugeren skriver ind: Hans' fødselsdag
Streng "escaped" fordi magic quotes er slået til: Hans\' fødselsdag
Streng efter en tur gennem mysql_escape_string(): Hans\\\' fødselsdag
Mysql vil så se bort fra to af backslash'erne så resultatet i databasen
bliver: Hans\' fødselsdag hvor man egentlig ville have haft: Hans'
fødselsdag
Hvis magic quotes er slået til bliver man derfor enten nødt til at lade
være med at bruge mysql_escape_string() og håbe på at udbyderen ikke
ændrer på opsætningen eller køre alle variabler der skal i databasen
gennem både stripslashes() og mysql_escape_string().
Links til stripslashes() og info om magic quotes:
www.php.net/stripslashes
www.php.net/magic_quotes
Zilla.
| |
Peter Brodersen (10-05-2005)
| Kommentar Fra : Peter Brodersen |
Dato : 10-05-05 21:03 |
|
On Tue, 10 May 2005 21:02:39 +0200, Zilla <mail.is.not@an.option>
wrote:
>Det er rigtigt, men det er godt at vide dette, så man gør det rigtigt.
>Når det er sagt så kan det give nogle uventede resultater ved at bruge
>mysql_escape_string() når magic quotes er slået til. Her kan man nemlig
>komme ud for at en streng som allerede er "escaped" pga. magic quotes
>bliver "escaped" endnu en gang. Eks.:
Under alle omstændigheder er der ingen grund til at bruge
mysql_escape_string() i stedet for mysql_real_escape_string(), der
også tager højde for tegnsæt. Forestil dig et to-byte-tegnsæt, hvor et
tegn fx er Å' - altså bytesekvensen [Å'] udgør ét tegn.
Her vil mysql_escape_string() så konvertere det til Å\' - altså [Å\]
som første tegn, og så vil ' pludselig blive skubbet ud og blive en
strengseparator - og netop udgøre en sikkerhedsrisiko.
Det kræver dog rigtigt nok at man bruger et specielt tegnsæt.
Problemstillingen vil ikke forekomme ved UTF-8, idet begge/alle tegn i
en bytesekvens vil være highbits (og ' eller " vil så ikke forekomme
dér).
>Hvis magic quotes er slået til bliver man derfor enten nødt til at lade
>være med at bruge mysql_escape_string() og håbe på at udbyderen ikke
>ændrer på opsætningen eller køre alle variabler der skal i databasen
>gennem både stripslashes() og mysql_escape_string().
Jeg kan kun anbefale at bruge et api i stil med PEAR DB - og så evt.
indlede projekter, der tjekker på hælde $_REQUEST og venner igennem
stripslashes, fx:
if (get_magic_quotes_gpc()) {
$_REQUEST = array_map('stripslashes',$_REQUEST);
}
(duer dog ikke for arrays)
Det er i første omgang noget klamp at skulle klippeklistre queries
sammen.
--
- Peter Brodersen
| |
Dan Storm (09-05-2005)
| Kommentar Fra : Dan Storm |
Dato : 09-05-05 15:44 |
|
Hvis du nu keder dig, så har jeg en lille quick guide til sessions her:
http://err0r.dk/docs.php?fetchdoc=1
Der ligger også et forslag til hvordan du kan benytte MySQL til
brugersystem sammen med sessions.
Men ellers, så er den måde du henter ID'et på også forkert... Der skal stå:
$_SESSION['id'] = mysql_result($result, 0, 'id');
--
Dan Storm
http://err0r.dk
storm@err0r.dk
PGP Public key på http://err0r.dk/pubring.pkr
>>> husk på; en ekspert er en person der har begået alle fejl mulige
inden for et bestemt område
| |
Nederbasse (11-05-2005)
| Kommentar Fra : Nederbasse |
Dato : 11-05-05 07:27 |
|
"Dan Storm" <shadyz@_REMOVETHIS_err0r.dk> skrev i en meddelelse
news:427f7715$0$192$edfadb0f@dread11.news.tele.dk...
> Hvis du nu keder dig, så har jeg en lille quick guide til sessions her:
> http://err0r.dk/docs.php?fetchdoc=1
>
> Der ligger også et forslag til hvordan du kan benytte MySQL til
> brugersystem sammen med sessions.
>
> Men ellers, så er den måde du henter ID'et på også forkert... Der skal
stå:
> $_SESSION['id'] = mysql_result($result, 0, 'id');
>
> --
> Dan Storm
>
> http://err0r.dk
> storm@err0r.dk
>
Okay jeg kan forstå $_SESSION['id'] = mysql_result($result men hvor kommer
0, fra ?
LarsN
| |
Dan Storm (11-05-2005)
| Kommentar Fra : Dan Storm |
Dato : 11-05-05 10:20 |
|
syntaksen er mysql_result( resource result, int row [, mixed field])
Idet at din mysql forespørgsel ligger i variablen $result, er dette
selvsagt vores 'resource result'.
int row er så den række du vil hente dit resultat fra. Da du faktisk kun
får 1 række ud af forespørgslen (da der jo kun er en bruger der benytter
denne) så har den ene række nummeret 0. Hvis du havde to rækker så ville
den første række have nummeret 0, og den anden række nummer 1. Og resten
er vel selvsagt.
mixed field er kun nødvendigt når du henter mere end et felt i din
forespørgsel (f.eks "SELECT * FROM table" eller SELECT id, name FROM
TABLE"). Hvis din forespørgsel havde været "SELECT id FROM table" ville
det være nok at skrive mysql_result($result, 0)
Men da du henter flere felter er det nødvendigt at benytte sig af mixed
field.
Altså, mysql_result(sql_query, row_number, field_name) =>
mysql_result($result, 0, 'id')
Håber det er godt nok! :)
--
Dan Storm
http://err0r.dk
storm@err0r.dk
PGP Public key på http://err0r.dk/pubring.pkr
>>> husk på; en ekspert er en person der har begået alle fejl mulige
inden for et bestemt område
| |
Nederbasse (11-05-2005)
| Kommentar Fra : Nederbasse |
Dato : 11-05-05 11:12 |
|
"Dan Storm" <shadyz@_REMOVETHIS_err0r.dk> skrev i en meddelelse
news:4281ce0e$0$177$edfadb0f@dread11.news.tele.dk...
> syntaksen er mysql_result( resource result, int row [, mixed field])
>
> Idet at din mysql forespørgsel ligger i variablen $result, er dette
> selvsagt vores 'resource result'.
>
> int row er så den række du vil hente dit resultat fra. Da du faktisk kun
> får 1 række ud af forespørgslen (da der jo kun er en bruger der benytter
> denne) så har den ene række nummeret 0. Hvis du havde to rækker så ville
> den første række have nummeret 0, og den anden række nummer 1. Og resten
> er vel selvsagt.
>
> mixed field er kun nødvendigt når du henter mere end et felt i din
> forespørgsel (f.eks "SELECT * FROM table" eller SELECT id, name FROM
> TABLE"). Hvis din forespørgsel havde været "SELECT id FROM table" ville
> det være nok at skrive mysql_result($result, 0)
>
> Men da du henter flere felter er det nødvendigt at benytte sig af mixed
> field.
>
> Altså, mysql_result(sql_query, row_number, field_name) =>
> mysql_result($result, 0, 'id')
>
> Håber det er godt nok! :)
>
> --
> Dan Storm
>
> http://err0r.dk
> storm@err0r.dk
>
>
Det begynder at dæmre
God guide du har om sessions (og sød knægt)
LaesN
| |
Dan Storm (11-05-2005)
| Kommentar Fra : Dan Storm |
Dato : 11-05-05 11:56 |
| | |
|
|