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é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é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/