/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
REPLACE...
Fra : Dennis Munding


Dato : 29-04-05 19:02

Hej NG!

Så er jeg her igen...

Har lidt (læs: mange!) problemer med at erstatte (REPLACE) data i min
database...

Jeg har forsøgt at sende $id via et link til en "redigér-side", men jeg kan
ikke få det til at virke...

Opbygningen er således:

Oversigt over indhold i database. [Redigér-link] [Slet-link]
Når man klikker på [Redigér], bliver man sendt til redigér-siden, hvor der
er en formular, hvor den pågældende events indhold (også et problem!), gerne
skulle skrives ind automatisk....
Når man så har rettet det, der skal rettes, klikker man på det endelige
redigér-link, som fører til en kontrol-fil, som tjekker oplysningerne og så
gerne skulle udskifte de gamle data med de nye....

Men jeg kan ikke få det til at virke..??

Sådan ser linket til "redigér-siden" ud:
<a href=\"min-fil2.php?EventId='$id'\">Redig&eacute;r</a>


"Mellem-stationen" - siden med formen - ser således ud (jeg har udeladt
form-indholdet):

(Her er der bl.a. "session_start"...)

<?php
$id = $_GET['EventId'];
if(isset($_SESSION['logget_ind'])){
echo " <h1 style=\"margin:0%;padding:2%;\"> $strTitle </h1><br />";

echo "<div style=\"width:70%;margin-left:16%;margin-right:auto;\">
<form action=\"DKal-rediger.php\" method=\"post\">

[FORM-INDHOLD HER!]

</div><br />

<div style=\"width:70%;margin-left:16%;margin-right:auto;\">
<p
style=\"margin-bottom:0%;font-weight:bold;text-align:left;\">Aktivitet:<br
/>
<textarea name=\"event\" rows=\"6\" cols=\"31\"></textarea><br />
<input type=\"submit\" value=\"Redigér\" /> <input type=\"reset\"
value=\"Fortryd\" /></p> (Denne linie skal rettes, men jeg ved ikke helt,
hvilken værdi jeg skal skrive ved "type"...??)
</form>";
?>
</div>

<? include("menu"); ?><br />

</div>

<?php
}
else
{
echo "<h1>Ukorrekt login</h1>

<p>Du skal være logget ind for at se disse sider. <a class=\"tlink\"
href=\"D-login.php\">Log in</a></p>";
}
?>


Og sådan ser kontrol-filen ud:

<?php
$conn = mysql_connect("server", "bruger", "password");
mysql_select_db('database', $conn);
$id = $_GET['EventId'];
$event = $_GET['Event'];
$sql = "REPLACE INTO drenge_events WHERE EventId=$id";
$result = mysql_query($sql, $conn) or die(mysql_error());
if (mysql_query($sql, $conn)) {
header ("Location: min-fil.php");
} else {
echo "Der er sket en fejl - aktiviteten er IKKE rettet!!";
echo "<a href=\"min-fil.php\">Tilbage</a>";
}
?>

Nogen, som kan/vil hjælpe mig??


På forhånd tusind tak!


Med venlig hilsen
--
Dennis Munding
Webmaster
http://www.skovaa-munding.dk/
http://www.mundings-memorial.dk/
http://www.cantica.dk/



 
 
Troels Arvin (29-04-2005)
Kommentar
Fra : Troels Arvin


Dato : 29-04-05 19:56

On Fri, 29 Apr 2005 20:02:12 +0200, Dennis Munding wrote:

> Sådan ser linket til "redigér-siden" ud:
> <a href=\"min-fil2.php?EventId='$id'\">Redig&eacute;r</a>

Hvis $id kommer direkte fra GET/POST/COOKIES har du hermed et cross-site
scripting (XSS) problem.

> <?php
> $conn = mysql_connect("server", "bruger", "password");
> mysql_select_db('database', $conn);
> $id = $_GET['EventId'];
> $event = $_GET['Event'];
> $sql = "REPLACE INTO drenge_events WHERE EventId=$id"; $result =

Her har du en grim SQL-injection svaghed, med mindre din PHP kører med
"magic quotes" slået til.


> if (mysql_query($sql, $conn)) {
> header ("Location: min-fil.php");

Location-headere skal ifølge HTTP-standarden inkludere den fulde URL,
alstå også med http://domænenavn/sti/

> Nogen, som kan/vil hjælpe mig??

Bortset fra ovenstående, måske lidt irriterende - men efter min mening
vigtige - brokkerier: Jeg synes at din problemstilling er uklar. Jeg vil
anbefale dig, at du simplificerer dine kodestumper så meget som muligt,
og fx. ikke inkluderer "class=...", "<div...>", osv. Og så er det også
rart at høre om evt. fejlmeddelelser du måtte opleve, eller en mere
kontakt beskrivelse af, hvad det er, der ikke virker.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Dennis Munding (29-04-2005)
Kommentar
Fra : Dennis Munding


Dato : 29-04-05 20:30

Hej Troels!
"Troels Arvin" <troels@arvin.dk> skrev i en meddelelse
news:pan.2005.04.29.18.56.04.805691@arvin.dk...

Min fejl - glemte at skrive, at jeg er newbie! :-/
Så jeg spørger, som jeg har forstand til.... (eller mangel på samme...!?)


> > Sådan ser linket til "redigér-siden" ud:
> > <a href=\"min-fil2.php?EventId='$id'\">Redig&eacute;r</a>
>
> Hvis $id kommer direkte fra GET/POST/COOKIES har du hermed et cross-site
> scripting (XSS) problem.

Ikke forstået...

> > <?php
> > $conn = mysql_connect("server", "bruger", "password");
> > mysql_select_db('database', $conn);
> > $id = $_GET['EventId'];
> > $event = $_GET['Event'];
> > $sql = "REPLACE INTO drenge_events WHERE EventId=$id"; $result =
>
> Her har du en grim SQL-injection svaghed, med mindre din PHP kører med
> "magic quotes" slået til.

Det har jeg egentlig ikke tjekket - p.t. tester jeg lokalt på egen server...

> > if (mysql_query($sql, $conn)) {
> > header ("Location: min-fil.php");
>
> Location-headere skal ifølge HTTP-standarden inkludere den fulde URL,
> alstå også med http://domænenavn/sti/

Er det meget vigtigt, eller er det "blot" en "skønheds-fejl"?

> > Nogen, som kan/vil hjælpe mig??
>
> Bortset fra ovenstående, måske lidt irriterende - men efter min mening
> vigtige - brokkerier: Jeg synes at din problemstilling er uklar. Jeg vil
> anbefale dig, at du simplificerer dine kodestumper så meget som muligt,
> og fx. ikke inkluderer "class=...", "<div...>", osv. Og så er det også
> rart at høre om evt. fejlmeddelelser du måtte opleve, eller en mere
> kontakt beskrivelse af, hvad det er, der ikke virker.

Som sagt: Jeg er newbie (ved godt, at det ikke er den bedste
undskyldning...), så jeg skal først til at lære, hvordan man beskriver
problemet bedst, så det bliver nemmere at hjælpe...

Problemet er i sin enkelthed, at jeg ikke kan erstatte data i min database
med ovenstående opsætning.

Jeg håber derfor på, at der findes en "php-nørd", som kan fortælle sådan en
amatør som mig, hvordan jeg skal stille det op....?

Jeg tænker lige problemet igennem igen, for at komme med en bedre forklaring
(hvis jeg kan!), og for at få noteret fejlmeldingen ned...
Jeg skriver igen imorgen...

Tak for dit svar!


Med venlig hilsen
--
Dennis Munding
Webmaster
http://www.skovaa-munding.dk/
http://www.mundings-memorial.dk/
http://www.cantica.dk/



Jacob Atzen (30-04-2005)
Kommentar
Fra : Jacob Atzen


Dato : 30-04-05 07:49

On 2005-04-29, Dennis Munding <mail@invalid.com> wrote:
> Som sagt: Jeg er newbie (ved godt, at det ikke er den bedste
> undskyldning...), så jeg skal først til at lære, hvordan man beskriver
> problemet bedst, så det bliver nemmere at hjælpe...

Du kunne jo prøve at læse:

<http://php-faq.dk/index.php/Gode_spørgsmål>

Der står ret udførligt beskrevet, hvordan man skriver spørgsmål, der er
til at svare på.

--
Med venlig hilsen
- Jacob Atzen

Dennis Munding (30-04-2005)
Kommentar
Fra : Dennis Munding


Dato : 30-04-05 09:44

Hej Jacob!
"Jacob Atzen" <jacob@aub.dk> skrev i en meddelelse
news:slrnd76ai5.bh.jacob@tank.aub.dk...
> On 2005-04-29, Dennis Munding <mail@invalid.com> wrote:
> > Som sagt: Jeg er newbie (ved godt, at det ikke er den bedste
> > undskyldning...), så jeg skal først til at lære, hvordan man beskriver
> > problemet bedst, så det bliver nemmere at hjælpe...
>
> Du kunne jo prøve at læse:
>
> <http://php-faq.dk/index.php/Gode_spørgsmål>
>
> Der står ret udførligt beskrevet, hvordan man skriver spørgsmål, der er
> til at svare på.

Har jeg skam læst - er bare ikke særlig god til at formulere mig...

Men nu får jeg lige tid til at tænke over det igen - skal nemlig på arbejde!


Så jeg vender tilbage iaften med et - forhåbenligt - velformuleret
spørgsmål...


Med venlig hilsen
--
Dennis Munding
Webmaster
http://www.skovaa-munding.dk/
http://www.mundings-memorial.dk/
http://www.cantica.dk/



Jacob Atzen (30-04-2005)
Kommentar
Fra : Jacob Atzen


Dato : 30-04-05 11:37

On 2005-04-30, Dennis Munding <mail@invalid.com> wrote:
> Har jeg skam læst - er bare ikke særlig god til at formulere mig...
>

Så tror jeg du skal prøve at læse den igen, for dit indlæg gør præcist
det modsatte af flere af rådene i artiklen

Herunder har jeg prøvet at skrive lidt gode råd og lidt analyse af dit
indlæg. Mange af rådene er mine personlige, så det er ikke sikkert at
alle andre har det på samme måde. Jeg forestiller mig dog, at de fleste
vil være enige i hovedparten af mine pointer (især eftersom en del af
dem bare er gentagelser af, hvad klogere mennesker end mig har sagt
). Hvorvidt du vælger at rette dig efter mine råd eller ej, er
naturligvis op til dig selv, men jeg tror du vil finde ud af, at du gør
tingene nemmere for dig selv ved at følge dem.

Din emne linie er bare "REPLACE" en mere sigende linie kunne være
"Problem med erstatning i database" - så ved vi pludselig, at du har et
problem, at det handler om database og erstatninger.

Du gengiver omkring 60 liniers kode istedet for at smide det op på
pastebin.dk eller lignende. Og som Troels så rigtigt skriver, så
gengiver du en masse unødig støj i forhold til problemet.

Dette skyldes nok, at du ikke har fundet årsagen til problemet. Du ved
ikke, hvorvidt det stammer fra den måde du hopper fra side til side på,
om det skyldes din SQL er forkert eller noget tredje.

Prøv at gøre de enkelte trin i processen klare for dig selv. Er der de
rigtige links på din startside? Kommer man rigtigt fra den ene side til
den næste? Indeholder dine variable de ting du forventer de indeholder?
Er din SQL korrekt? En måde at undersøge disse spørgsmål på er ved at
skrive relevant information ud på skærmen. Hvis du f.eks. tror at din
$id variabel indeholder et bestemt id, så check det.

Din problembeskrivelse bliver unødigt lang og kompleks, når du ikke
selv finder ud af, hvad det egentlige problem er før du spørger.

FAQ'en siger i afsnit 4, at du bør skrive, hvad din kode gør og hvad du
forventer at den gør. Ligenu skriver du bare "jeg kan ikke få det til at
virke". Hvad er det der ikke virker? Bliver tabellen ikke opdateret i
databasen? Bliver dine variable ikke sat ordentligt?

Til sidst vil det være en god ide, hvis du deler uafhængige spørgsmål op
og skriver et indlæg pr. spørgsmål. Du skriver f.eks:

<input type=\"reset\" value=\"Fortryd\" /></p> (Denne linie skal
rettes, men jeg ved ikke helt, hvilken værdi jeg skal skrive ved
"type"...??)

Det havde jeg faktisk totalt overset da jeg oprindeligt læste dit
indlæg, fordi det stod inde i din kode, som jeg ikke ville bruge tid på
at nærlæse, da der var så meget. Og spørgsmålet er totalt urelateret til
resten af indlægget, så hvis nu der sad en derude, der lige præcis
vidste, hvordan man skulle angive type i et input tag risikerer du han
springer dit indlæg over fordi det omhandler database.

--
Med venlig hilsen
- Jacob Atzen

Dennis Munding (04-05-2005)
Kommentar
Fra : Dennis Munding


Dato : 04-05-05 09:44

Hej Jacob!
"Jacob Atzen" <jacob@aub.dk> skrev i en meddelelse
news:slrnd76ntd.bh.jacob@tank.aub.dk...
> Så tror jeg du skal prøve at læse den igen, for dit indlæg gør præcist
> det modsatte af flere af rådene i artiklen

Er hermed gjort - kan godt se, at jeg ikke havde læst den godt nok....

> Herunder har jeg prøvet at skrive lidt gode råd og lidt analyse af dit
> indlæg. Mange af rådene er mine personlige, så det er ikke sikkert at
> alle andre har det på samme måde. Jeg forestiller mig dog, at de fleste
> vil være enige i hovedparten af mine pointer (især eftersom en del af
> dem bare er gentagelser af, hvad klogere mennesker end mig har sagt
> ). Hvorvidt du vælger at rette dig efter mine råd eller ej, er
> naturligvis op til dig selv, men jeg tror du vil finde ud af, at du gør
> tingene nemmere for dig selv ved at følge dem.

Gode råd kan man aldrig få nok af....

> Din emne linie er bare "REPLACE" en mere sigende linie kunne være
> "Problem med erstatning i database" - så ved vi pludselig, at du har et
> problem, at det handler om database og erstatninger.

Prøvede bare at gøre det kort - men jeg kan godt se nu, at dit eksempel er
mere sigende...

> Du gengiver omkring 60 liniers kode istedet for at smide det op på
> pastebin.dk eller lignende. Og som Troels så rigtigt skriver, så
> gengiver du en masse unødig støj i forhold til problemet.

Skyldes måske mit manglende kendskab til pastebin.dk...??
Har kigget på siden, men ved ikke lige hvordan det "fungerer"....??

> Dette skyldes nok, at du ikke har fundet årsagen til problemet. Du ved
> ikke, hvorvidt det stammer fra den måde du hopper fra side til side på,
> om det skyldes din SQL er forkert eller noget tredje.

Det har du ret i!
Men jeg ved dog (tror jeg nok!), at springet fra side til side fungerer
fint, men der er mange ting i php-koderne, som jeg ikke fatter en dyt af!

> Prøv at gøre de enkelte trin i processen klare for dig selv. Er der de
> rigtige links på din startside? Kommer man rigtigt fra den ene side til
> den næste? Indeholder dine variable de ting du forventer de indeholder?
> Er din SQL korrekt? En måde at undersøge disse spørgsmål på er ved at
> skrive relevant information ud på skærmen. Hvis du f.eks. tror at din
> $id variabel indeholder et bestemt id, så check det.

Nu går det i sort igen....
Jeg er Newbie! Skær det venligst ud i pap:
"...skrive relevant information ud på skærmen.", "..., så check det." ???
Hvordan gør man så det?? (skridt for skridt - tak!)

> Din problembeskrivelse bliver unødigt lang og kompleks, når du ikke
> selv finder ud af, hvad det egentlige problem er før du spørger.
>
> FAQ'en siger i afsnit 4, at du bør skrive, hvad din kode gør og hvad du
> forventer at den gør. Ligenu skriver du bare "jeg kan ikke få det til at
> virke". Hvad er det der ikke virker? Bliver tabellen ikke opdateret i
> databasen? Bliver dine variable ikke sat ordentligt?

At de gamle data ikke bliver erstattet af de nye...

> Til sidst vil det være en god ide, hvis du deler uafhængige spørgsmål op
> og skriver et indlæg pr. spørgsmål. Du skriver f.eks:
>
> <input type=\"reset\" value=\"Fortryd\" /></p> (Denne linie skal
> rettes, men jeg ved ikke helt, hvilken værdi jeg skal skrive ved
> "type"...??)
>
> Det havde jeg faktisk totalt overset da jeg oprindeligt læste dit
> indlæg, fordi det stod inde i din kode, som jeg ikke ville bruge tid på
> at nærlæse, da der var så meget. Og spørgsmålet er totalt urelateret til
> resten af indlægget, så hvis nu der sad en derude, der lige præcis
> vidste, hvordan man skulle angive type i et input tag risikerer du han
> springer dit indlæg over fordi det omhandler database.

Jeg ville bare spare lidt på pladsen i nyhedsgruppen - dumt!

Tak for din besvarelse - det gav stof til eftertanke....


Med venlig hilsen
--
Dennis Munding
Web-master
http://www.skovaa-munding.dk/
http://www.mundings-memorial.dk/
http://www.cantica.dk/



Jacob Atzen (04-05-2005)
Kommentar
Fra : Jacob Atzen


Dato : 04-05-05 12:13

On 2005-05-04, Dennis Munding <mail@invalid.com> wrote:
> Skyldes måske mit manglende kendskab til pastebin.dk...??
> Har kigget på siden, men ved ikke lige hvordan det "fungerer"....??

pastebin.dk er tilsyneladende nede. Brug pastebin.com istedet. Det er
meget nemt - du paster din kode ind i det store tekstfelt, skriver dit
navn i det lille og trykker send. Så bliver din post tildelt et nummer,
som fremgår af URL'en. Så skal du bare fortælle os URL'en når du poster.

> Det har du ret i!
> Men jeg ved dog (tror jeg nok!), at springet fra side til side fungerer
> fint, men der er mange ting i php-koderne, som jeg ikke fatter en dyt af!

Så må du starte fra en ende af. Men hvis du ikke fatter en dyt af, hvad
der foregår er det måske en ide at overveje et lidt mere simpelt projekt
først.

>> Prøv at gøre de enkelte trin i processen klare for dig selv. Er der de
>> rigtige links på din startside? Kommer man rigtigt fra den ene side til
>> den næste? Indeholder dine variable de ting du forventer de indeholder?
>> Er din SQL korrekt? En måde at undersøge disse spørgsmål på er ved at
>> skrive relevant information ud på skærmen. Hvis du f.eks. tror at din
>> $id variabel indeholder et bestemt id, så check det.
>
> Nu går det i sort igen....
> Jeg er Newbie! Skær det venligst ud i pap:
> "...skrive relevant information ud på skærmen.", "..., så check det." ???
> Hvordan gør man så det?? (skridt for skridt - tak!)

Hvis du tror, at variablen $id indeholder værdien 5, så skriver du:

print 'id = ['.$id.']';

Og så checker du, når du kigger på siden at id virkelig er lig 5.

--
Med venlig hilsen
- Jacob Atzen

Dennis Munding (04-05-2005)
Kommentar
Fra : Dennis Munding


Dato : 04-05-05 14:03

Hej igen Jacob!
"Jacob Atzen" <jacob@aub.dk> skrev i en meddelelse
news:slrnd7hbi1.bh.jacob@tank.aub.dk...
> On 2005-05-04, Dennis Munding <mail@invalid.com> wrote:
> > Skyldes måske mit manglende kendskab til pastebin.dk...??
> > Har kigget på siden, men ved ikke lige hvordan det "fungerer"....??
>
> pastebin.dk er tilsyneladende nede. Brug pastebin.com istedet. Det er
> meget nemt - du paster din kode ind i det store tekstfelt, skriver dit
> navn i det lille og trykker send. Så bliver din post tildelt et nummer,
> som fremgår af URL'en. Så skal du bare fortælle os URL'en når du poster.

Ok! En slags "Opslags-tavle" for koder...??
Kan jeg så poste koden til de 3 sider, som jeg mener indeholder mit problem
i det samme link, eller vil det blive for uoverskueligt?
Skal måske bare poste dem i hvert sit link...

> > Det har du ret i!
> > Men jeg ved dog (tror jeg nok!), at springet fra side til side fungerer
> > fint, men der er mange ting i php-koderne, som jeg ikke fatter en dyt
af!
>
> Så må du starte fra en ende af. Men hvis du ikke fatter en dyt af, hvad
> der foregår er det måske en ide at overveje et lidt mere simpelt projekt
> først.

Prøver også fra en ende af - jeg er bare starte i midten, og bevæger mig så
ud mod enderne...
Det gør ikke noget, at det er lidt indviklet - hvis bare jeg får det her
gennemført, så kan jeg sidde og "lege" med koderne bagefter, for at se de
forskellige funktioner - jeg lærer nemmere på den måde...
Har prøvet nogle af de simple eksempler, der er i bogen "Introduktion til
PHP, MySQL og Apache" af Julie C. Meloni, men det bliver hurtigt for
kedeligt.
Og så synes jeg ikke, at kommer omkring "replace" særlig godt - der er kun
én side i alt om emnet... :-/

> >> Prøv at gøre de enkelte trin i processen klare for dig selv. Er der de
> >> rigtige links på din startside? Kommer man rigtigt fra den ene side til
> >> den næste? Indeholder dine variable de ting du forventer de indeholder?
> >> Er din SQL korrekt? En måde at undersøge disse spørgsmål på er ved at
> >> skrive relevant information ud på skærmen. Hvis du f.eks. tror at din
> >> $id variabel indeholder et bestemt id, så check det.
> >
> > Nu går det i sort igen....
> > Jeg er Newbie! Skær det venligst ud i pap:
> > "...skrive relevant information ud på skærmen.", "..., så check det."
???
> > Hvordan gør man så det?? (skridt for skridt - tak!)
>
> Hvis du tror, at variablen $id indeholder værdien 5, så skriver du:
>
> print 'id = ['.$id.']';
>
> Og så checker du, når du kigger på siden at id virkelig er lig 5.

Oki! Det er til at forstå! Mere af samme slags, tak...
A ska ha æ skovlet ind mæ skeer...
Det vil jeg straks prøve....

Men jeg har sådan set fået løst lidt af mit problem...
Jeg har fået det til at skrive de forskellige variabler ind i en form, og
det er et godt stykke af vejen....
Nu mangler jeg blot af få det til at erstatte de gamle data med de nye, for
som det er nu, tilføjes der bare 2 tomme "events" med dato'en 0/0-00 og
tidspunktet 00:00:00....

Jeg kan ikke greje, hvorfor den tilføjer hele 2 og ikke kun én event....
Og jeg får ingen fejl-melding, må jeg hellere huske at skrive....

Så jeg formoder, at det er fra fil2 til fil3, at det går galt...
Fil2 indeholder en form, hvor man skal redigerer indholdet, og fil3 skulle
så gerne "replace" det i data-basen....

Men jeg finder måske ud af det på et tidspunkt - jeg skal bare væbne mig med
noget, jeg ikke har meget af i denne sammenhæng - tålmodighed!

Men endnu en gang mange tak for dit svar!


Med venlig hilsen
--
Dennis Munding
Web-master
http://www.skovaa-munding.dk/
http://www.mundings-memorial.dk/
http://www.cantica.dk/



Dennis Munding (04-05-2005)
Kommentar
Fra : Dennis Munding


Dato : 04-05-05 14:06

"Jacob Atzen" <jacob@aub.dk> skrev i en meddelelse
news:slrnd7hbi1.bh.jacob@tank.aub.dk...
> pastebin.dk er tilsyneladende nede. Brug pastebin.com istedet.

[SNIP]

Har ingen problemer med at komme ind på pastebin.dk lige nu...
Så jeg prøver at ligge min kode op der - linket kommer senere...


Med venlig hilsen

Dennis Munding



Dennis Munding (04-05-2005)
Kommentar
Fra : Dennis Munding


Dato : 04-05-05 14:48

Hej igen, igen Jacob!

Så har jeg lagt det op på pastebin.dk....

Jeg har tilladt mig at oprette en ny tråd - mest for at give mig selv et
bedre overblik....

Links til filerne er i den nye tråd - slevfølgelig...


Med venlig hilsen
--
Dennis Munding
Web-master
http://www.skovaa-munding.dk/
http://www.mundings-memorial.dk/
http://www.cantica.dk/



Troels Arvin (30-04-2005)
Kommentar
Fra : Troels Arvin


Dato : 30-04-05 10:10

On Fri, 29 Apr 2005 21:30:07 +0200, Dennis Munding wrote:
>> Hvis $id kommer direkte fra GET/POST/COOKIES har du hermed et cross-site
>> scripting (XSS) problem.
>
> Ikke forstået...

http://www.google.com/search?hl=en&lr=&c2coff=1&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&q=%22cross+site+scripting%22+OR+%22cross-site+scripting%22+OR+%22X-site+scripting%22+OR+XSS+php+htmlspecialchars&btnG=Search

Det vigtige er, at du skal huske at køre funktionen htmlspecialchars()
på udefra kommende data før du output'er dem. Fx.

<?php
$id=$_REQUEST['id'];
$HTMLid=htmlspecialchars($id);
print "<a href=\"min-fil2.php?EventId=$HTMLid\">Redig&eacute;r</a>";
?>

>> Her har du en grim SQL-injection svaghed, med mindre din PHP kører med
>> "magic quotes" slået til.
>
> Det har jeg egentlig ikke tjekket - p.t. tester jeg lokalt på egen server...

Med PHP er man desværre nødt til at sikre sig, at man har styr på
"magic quotes":
http://dk.php.net/manual/en/security.magicquotes.php

Det er p*sse irriterende, og én af PHPs helt store fejl, at man - grundet
magic quotes - kun vanskeligt kan skrive kode, der kan køre på
forskellige PHP-installationer, fordi man principielt er nødt til at tage
hensyn til, at magic quotes-indstillingen kan antage forskellige værdier
på forskellige servere.

Jeg kunne foreslå, at du i din kode starter med noget i stil med:

assert(!get_magic_quotes_gpc());

Det betyder, at din side simpelthen vil nægte at køre, hvis magic qoutes
er slået til. Eller, hvis du koder under forventning om, at det er slået
til:

assert(get_magic_quotes_gpc());

Jeg ved godt, at problematikken kan virke unødigt forvirrende, når man
er PHP newbie, men ikke desto mindre er det vigtigt.

>> Location-headere skal ifølge HTTP-standarden inkludere den fulde URL,
>> alstå også med http://domænenavn/sti/
>
> Er det meget vigtigt, eller er det "blot" en "skønheds-fejl"?

Det er nok mest i skønhedsfejl-kategorien. Men i en diskussiongruppe om
PHP synes jeg det er vigtigt at prøve at have et vist fokus på god
PHP-kodestil.

> Jeg tænker lige problemet igennem igen, for at komme med en bedre forklaring
> (hvis jeg kan!), og for at få noteret fejlmeldingen ned...

I et hvilket som helst diskussionsforum er det vigtigt at præsentere sit
problem så kortfattet og klart som muligt. Det betyder fx., at man er
nødt til at give eksempler, der er blottet for al unødvendig
layout-relateret kode.

PS:
Hvis SQL injection begrebet er volapyk, så læs følgende. (Uden at have
tjek på emnet, bliver man aldrig i stand til at skrive robust web-agtig
kode.):
http://www.php.net/manual/en/security.database.sql-injection.php
http://www.unixwiz.net/techtips/sql-injection.html
http://www.google.com/search?hl=en&lr=&c2coff=1&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&q=sql+injection+php+intval+mysql_real_escape_string&btnG=Search

Som MySQL-bruger er det bl.a. vigtigt have have styr på
http://dk.php.net/manual/en/function.mysql-real-escape-string.php
http://dk.php.net/manual/en/function.intval.php

Sidstnævnte kan i SQL-sammenhæng bruges til at tvinge data til at være
integers, før man propper dem ind i et SQL-udtryk, hvor integeres
forventes.

Grundet det tidligere nævnte PHP-irritationsmoment vedr. magic quotes kan
der dog gå kludder i det, hvis mysql_real_escape_string benyttes samtidig
med, at magic quotes er slået til.

--
Greetings from Troels Arvin, Copenhagen, Denmark


Dennis Munding (04-05-2005)
Kommentar
Fra : Dennis Munding


Dato : 04-05-05 10:24

Hej Troels!
"Troels Arvin" <troels@arvin.dk> skrev i en meddelelse
news:pan.2005.04.30.09.10.05.652270@arvin.dk...
> On Fri, 29 Apr 2005 21:30:07 +0200, Dennis Munding wrote:
> >> Hvis $id kommer direkte fra GET/POST/COOKIES har du hermed et
cross-site
> >> scripting (XSS) problem.
> >
> > Ikke forstået...
>
>
http://www.google.com/search?hl=en&lr=&c2coff=1&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&q=%22cross+site+scripting%22+OR+%22cross-site+scripting%22+OR+%22X-site+scripting%22+OR+XSS+php+htmlspecialchars&btnG=Search

En ting jeg ikke forstår, når man skal lære php - findes der ingen danske
sider??
For ærlig talt - jeg får ikke ret meget ud af at "læse" det, når det står på
engelsk... :-/

> Det vigtige er, at du skal huske at køre funktionen htmlspecialchars()
> på udefra kommende data før du output'er dem. Fx.
>
> <?php
> $id=$_REQUEST['id'];
> $HTMLid=htmlspecialchars($id);
> print "<a href=\"min-fil2.php?EventId=$HTMLid\">Redig&eacute;r</a>";
> ?>

Jeg prøvede at sætte ovenstående ind i min kode:

<?php
$conn = mysql_connect("localhost", "root");
mysql_select_db("kalender", $conn);
$sql = "select * from drenge_events order by EventYear, EventMonth,
EventDay, EventTime";
$result = mysql_query ($sql, $conn) or die(mysql_error());

$id=$_REQUEST['id'];
$HTMLid=htmlspecialchars($id);

while ($newArray = mysql_fetch_array($result)) {

$id = $newArray['EventId'];
$day = $newArray['EventDay'];
$month = $newArray['EventMonth'];
$year = $newArray['EventYear'];
$time = $newArray['EventTime'];
$event = $newArray['Event'];

[SNIP - unødvendig kode...]

<td><a
href=\"D-rediger.php?EventId=$HTMLid\">Redig&eacute;r</a></td>

[SNIP - mere unødvendig kode...]

}

[SNIP - igen...]

exit;
?>

<?php
}
else
{
echo "<h1>Ukorrekt login</h1>
<p>Du skal være logget ind for at se disse sider. <a
href=\"login-fil.php\">Log in</a></p>";
}
?>

Men det giver flg. fejl-meddelelse:

Notice: Undefined index: id in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 25

Linje 25: $id=$_REQUEST['id'];

Så hvad gør jeg galt her??
Jeg har forsøgt at fjerne flg.:

while ($newArray = mysql_fetch_array($result)) {

$id = $newArray['EventId'];
$day = $newArray['EventDay'];
$month = $newArray['EventMonth'];
$year = $newArray['EventYear'];
$time = $newArray['EventTime'];
$event = $newArray['Event'];
}

Men så får jeg flg. fejl:

Notice: Undefined index: id in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 25
Notice: Undefined variable: day in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 31
Notice: Undefined variable: month in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 31
Notice: Undefined variable: year in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 31
Notice: Undefined variable: time in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 32
Notice: Undefined variable: event in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 33

> >> Her har du en grim SQL-injection svaghed, med mindre din PHP kører med
> >> "magic quotes" slået til.
> >
> > Det har jeg egentlig ikke tjekket - p.t. tester jeg lokalt på egen
server...
>
> Med PHP er man desværre nødt til at sikre sig, at man har styr på
> "magic quotes":
> http://dk.php.net/manual/en/security.magicquotes.php
>
> Det er p*sse irriterende, og én af PHPs helt store fejl, at man - grundet
> magic quotes - kun vanskeligt kan skrive kode, der kan køre på
> forskellige PHP-installationer, fordi man principielt er nødt til at tage
> hensyn til, at magic quotes-indstillingen kan antage forskellige værdier
> på forskellige servere.
>
> Jeg kunne foreslå, at du i din kode starter med noget i stil med:
>
> assert(!get_magic_quotes_gpc());
>
> Det betyder, at din side simpelthen vil nægte at køre, hvis magic qoutes
> er slået til. Eller, hvis du koder under forventning om, at det er slået
> til:
>
> assert(get_magic_quotes_gpc());
>
> Jeg ved godt, at problematikken kan virke unødigt forvirrende, når man
> er PHP newbie, men ikke desto mindre er det vigtigt.

Jeg har forstået så meget af min læsning i ovenstående link, at det har
noget med sikkerhed at gøre - selvom det kan omgåes...?
Har lige prøvet begge variationer:
assert(get_magic_quotes_gpc()); = Warning: assert(): Assertion failed in
c:\programmer\easyphp1-7\www\cantica\includes\dkal-indhold.php on line 20

assert(!get_magic_quotes_gpc()); = Siden bliver vist uden fejl-melding (Det
gør den også uden denne linie!)

Men jeg har kigget i min php.ini, og der står "Magic quotes = on"??

> >> Location-headere skal ifølge HTTP-standarden inkludere den fulde URL,
> >> alstå også med http://domænenavn/sti/
> >
> > Er det meget vigtigt, eller er det "blot" en "skønheds-fejl"?
>
> Det er nok mest i skønhedsfejl-kategorien. Men i en diskussiongruppe om
> PHP synes jeg det er vigtigt at prøve at have et vist fokus på god
> PHP-kodestil.
>
> > Jeg tænker lige problemet igennem igen, for at komme med en bedre
forklaring
> > (hvis jeg kan!), og for at få noteret fejlmeldingen ned...
>
> I et hvilket som helst diskussionsforum er det vigtigt at præsentere sit
> problem så kortfattet og klart som muligt. Det betyder fx., at man er
> nødt til at give eksempler, der er blottet for al unødvendig
> layout-relateret kode.
>
> PS:
> Hvis SQL injection begrebet er volapyk, så læs følgende. (Uden at have
> tjek på emnet, bliver man aldrig i stand til at skrive robust web-agtig
> kode.):
> http://www.php.net/manual/en/security.database.sql-injection.php
> http://www.unixwiz.net/techtips/sql-injection.html
>
http://www.google.com/search?hl=en&lr=&c2coff=1&client=firefox-a&rls=org.mozilla%3Aen-US%3Aofficial&q=sql+injection+php+intval+mysql_real_escape_string&btnG=Search
>
> Som MySQL-bruger er det bl.a. vigtigt have have styr på
> http://dk.php.net/manual/en/function.mysql-real-escape-string.php
> http://dk.php.net/manual/en/function.intval.php
>
> Sidstnævnte kan i SQL-sammenhæng bruges til at tvinge data til at være
> integers, før man propper dem ind i et SQL-udtryk, hvor integeres
> forventes.

Og det bliver jeg som nævnt før ikke meget klogere af, da jeg ikke er så
pokkers god til engelsk...

> Grundet det tidligere nævnte PHP-irritationsmoment vedr. magic quotes kan
> der dog gå kludder i det, hvis mysql_real_escape_string benyttes samtidig
> med, at magic quotes er slået til.

Og det fatter jeg heller ikke noget af, men måske en dag....

Har lige endnu et spørgsmål:

På mit webhotel står der, at de kører php i "Safe mode" - hvad betyder det??
Har det noget at gøre med magic_quotes??

Mange tak for dit svar!

Med venlig hilsen
--
Dennis Munding
Web-master
http://www.skovaa-munding.dk/
http://www.mundings-memorial.dk/
http://www.cantica.dk/



Thomas Jari (04-05-2005)
Kommentar
Fra : Thomas Jari


Dato : 04-05-05 10:40

On Wed, 4 May 2005 11:24:05 +0200, "Dennis Munding" <mail@invalid.com>
wrote:

>En ting jeg ikke forstår, når man skal lære php - findes der ingen danske
>sider??
>For ærlig talt - jeg får ikke ret meget ud af at "læse" det, når det står på
>engelsk... :-/

En enkelt søgning på google på "php introduktion" gav mig følgende:

http://www.webcafe.dk/artikler/php/introduktion/

--
Mvh
Thomas Jari

Søg
Reklame
Statistik
Spørgsmål : 177517
Tips : 31968
Nyheder : 719565
Indlæg : 6408636
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste