/ 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
Hente en artikel fra Mysqlbase og redigere~
Fra : Andreas Falck


Dato : 17-08-04 14:23

Jeg er stødt ind i et problem som jeg ikke kan overskue, og søger
derfor hjælp - helt nede på gulvet hjælp, da jeg endnu ikke har fattet
ret meget af alt det her med PHP og Mysql

Jeg har følgende (der fungerer perfekt):

til indsættelse/oprettelse af artikler:

http://ravsted.net/index.php?body=admin/opret1.php

samt denne:
http://ravsted.net/index.php/admin/opret1.php

Koden til at oprette/indsætte artikler med er den samme i ovennævnte
links


og denne (der også fungerer fint):
http://ravsted.net/index.php/admin/rediger1.php?id=1

Men *denne* fungerer ikke:
http://ravsted.net/index.php?body=admin/rediger1.php?id=1

Det er samme kode der henter fra basen i begge de sidste links, og ser
sådan ud:

<?php
$db = mysql_connect("server", "brugernavn", "passwd");
mysql_select_db("database",$db);

echo "<form method=post action=/admin/rediger2.php>";

if ($id) {
$sql = "SELECT * FROM hist_artikel WHERE id=$id";
$result = mysql_query($sql);
$myrow = mysql_fetch_array($result);
$id = $myrow["id"];
$emne = $myrow["emne"];
$overskrift = $myrow["overskrift"];
$beskrivelse = $myrow["beskrivelse"];
$artikel = $myrow["artikel"];
$forfatter = $myrow["forfatter"];
?>

<p><b><a href=index.php?body=admin/rediger-slet.php">oversigt over
redigerbare poster</a></b>

<p><input type=hidden name="id" value="<?php echo $id ?>">

&nbsp; &nbsp; &nbsp; &nbsp; Emnegruppe: <input size=35 type="text"
name="emne" value="<?php echo $emne; ?>"><br>

&nbsp; &nbsp; &nbsp; &nbsp; Overskrift: &nbsp; &nbsp; &nbsp; <input
size=35 type="text" name="overskrift" value="<?php echo $overskrift;
?>"><br><br>

<p>Kort indledning:<br><textarea type="Text" name="beskrivelse"
cols=45 rows=5><?php echo $beskrivelse; ?></textarea>

<p>Indhold:<br><textarea type="Text" name="artikel" cols=45
rows=35><?php echo $artikel; ?></textarea>

<p>Forfatter: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<input size=40
type="text" name="forfatter" value="<?php echo $forfatter; ?>">

Jeg håber der er en der kan hjælpe mig

--
Med venlig hilsen Andreas Falck - ICQ 108 480 093
http://maranatha.dk/ + http://skabelsen.info/
http://bibeltro.dk/ + http://bibel-skole.dk/
http://ravsted.dk/ - *Byen hvor der virkelig sker noget*


 
 
Peter Brodersen (17-08-2004)
Kommentar
Fra : Peter Brodersen


Dato : 17-08-04 14:49

On Tue, 17 Aug 2004 15:23:13 +0200, "Andreas Falck"
<fake@skrift.dk.invalid> wrote:

>og denne (der også fungerer fint):
>http://ravsted.net/index.php/admin/rediger1.php?id=1
>
>Men *denne* fungerer ikke:
>http://ravsted.net/index.php?body=admin/rediger1.php?id=1

Prøv med:
http://ravsted.net/index.php?body=admin/rediger1.php&id=1

Det lader til at du include'r $body uden videre, men man kan ikke
include en sti i stil med "admin/rediger1.php?id=2". Det giver ingen
mening set fra filsystemets øjne. I stedet giver jeg her blot $id
videre til index.php, hvor variablen så er sat på forhånd, når
rediger1.php include's.

(under Apache kan du også bruge virtual() for at lave et internt
sub-request, hvor en sådan sti vil give mening:
http://dk.php.net/manual/en/function.virtual.php
Men den webserver kører du tilsyneladende ikke)


I det hele taget er det temmeligt usundt, sådan som du bare include'r
$body ukritisk. En ondsindet bruger kan jo rette den sti til noget
vilkårligt, og på den måde include sin egen kode (fra en ekstern
server) eller se vilkårlige filer på serveren.

Du bør læse:
http://www.php.net/manual/en/security.filesystem.php
--
- Peter Brodersen
php -r 'print floor(8.2-0.2);'
perl -le 'print 5-4.9;'

Andreas Falck (17-08-2004)
Kommentar
Fra : Andreas Falck


Dato : 17-08-04 15:08

I news:cft2db$73o$1@katie.ellegaard.dk skrev
Peter Brodersen følgende:

> Prøv med:
> http://ravsted.net/index.php?body=admin/rediger1.php&id=1

Tak, det virker.

> (under Apache kan du også bruge virtual() for at lave et internt
> sub-request, hvor en sådan sti vil give mening:
> http://dk.php.net/manual/en/function.virtual.php
> Men den webserver kører du tilsyneladende ikke)

Jeg kører sambar-server: http://sambar.dk - den er tilstrækkelig
enkelt til at selv jeg kan finde ud af den

> I det hele taget er det temmeligt usundt, sådan som du bare
> include'r $body ukritisk. En ondsindet bruger kan jo rette den sti
> til noget vilkårligt, og på den måde include sin egen kode (fra en
> ekstern server) eller se vilkårlige filer på serveren.
>
> Du bør læse:
> http://www.php.net/manual/en/security.filesystem.php

Var det muligt at få et oversættelseskoncentrat, da jeg heller ikke er
særlig god til engelsk?

--
Med venlig hilsen Andreas Falck - ICQ 108 480 093
http://maranatha.dk/ + http://skabelsen.info/
http://bibeltro.dk/ + http://bibel-skole.dk/
http://ravsted.dk/ - *Byen hvor der virkelig sker noget*


Peter Brodersen (17-08-2004)
Kommentar
Fra : Peter Brodersen


Dato : 17-08-04 16:08

On Tue, 17 Aug 2004 16:07:47 +0200, "Andreas Falck"
<fake@skrift.dk.invalid> wrote:

>> I det hele taget er det temmeligt usundt, sådan som du bare
>> include'r $body ukritisk. En ondsindet bruger kan jo rette den sti
>> til noget vilkårligt, og på den måde include sin egen kode (fra en
>> ekstern server) eller se vilkårlige filer på serveren.
>>
>> Du bør læse:
>> http://www.php.net/manual/en/security.filesystem.php
>
>Var det muligt at få et oversættelseskoncentrat, da jeg heller ikke er
>særlig god til engelsk?

I forhold til dine links, fx:
http://ravsted.net/index.php?body=admin/opret1.php
... så stoler du på at body ikke indeholder andre stier end dem, du
selv har opgivet i links.

Men en ondsindet bruger har jo fuld mulighed for selv at bestemme,
hvad body skal være sat til. Så kunne han passende vælge en fil på det
system, udover dem, dine links lige præcis peger på, og således få
serveret filer fra dit system. Et uskyldigt eksempel kunne være:
http://ravsted.net/index.php?body=../../../../windows/wordpad.ini
Angriberen kan selvfølgelig prøve at gætte på nogle filer med mere
følsomt indhold.

Ydermere, idet include() også virker på URLs, så kan brugeren lægge
noget PHP-kode tilgængelig på sin egen webserver, og så få din server
til at afvikle det (og den vej igennem have mulighed for at køre
programmer på din maskine).

Et fredeligt eksempel på inkludering af ekstern indhold, hvor der ikke
bliver afviklet kode i din ende, er:
http://ravsted.net/index.php?body=http://www.google.dk/

Der findes forskellige modeller til at løse dette problem. Helt
grundlæggende kan det siges så enkelt, at man skal validere input -
altså ikke tage brugerinput for givet (og slet ikke når brugeren har
indflydelse på præcis hvilken fil, der inkluderes). Det kræver måske
et par linjer ekstra kode, men det er nødvendigt nok (og fornuftigt,
mht. lille indsats i forhold til stort udbytte).

Et hurtigt eksempel på dette kunne være, at body ikke refererede til
en specifik fil, men bare et symbolsk navn - fx:

<?php
$body = $_REQUEST['body'];
switch($body) {
case 'adminside':
$include = "admin/opret1.php";
break;

case 'nyheder':
$include = "nyheder.inc";
break;

default:
$include = "";
}

if ($include != "") {
include($include);
}
?>

... og så skal links blot rettes tilsvarende til, fx:
index.php?body=nyheder, index.php?body=adminside og så videre.

Her vil en ondsindet person ikke få noget ud af at gå ind på
index.php?body=et_eller_andet_uventet

--
- Peter Brodersen
php -r 'print floor(8.2-0.2);'
perl -le 'print 5-4.9;'

Andreas Falck (18-08-2004)
Kommentar
Fra : Andreas Falck


Dato : 18-08-04 03:24

I news:cft71f$bj4$1@katie.ellegaard.dk skrev
Peter Brodersen følgende:

[ klip af masser brugbart ]

> .. og så skal links blot rettes tilsvarende til, fx:
> index.php?body=nyheder, index.php?body=adminside og så videre.
>
> Her vil en ondsindet person ikke få noget ud af at gå ind på
> index.php?body=et_eller_andet_uventet

Du skal have mange tak for dine oplysninger.

Jeg har efter bedste evne prøvet at få det lavet som du foreslog, og
for mig ser det nu ud til at virke. Men du må da gerne prøve igen om
du kan se yderligere sikkerhedsbrister ved siden.

--
Med venlig hilsen Andreas Falck - ICQ 108 480 093
http://maranatha.dk/ + http://skabelsen.info/
http://bibeltro.dk/ + http://bibel-skole.dk/
http://ravsted.dk/ - *Byen hvor der virkelig sker noget*


Peter Brodersen (18-08-2004)
Kommentar
Fra : Peter Brodersen


Dato : 18-08-04 04:37

On Wed, 18 Aug 2004 04:24:12 +0200, "Andreas Falck"
<fake@skrift.dk.invalid> wrote:

>Jeg har efter bedste evne prøvet at få det lavet som du foreslog, og
>for mig ser det nu ud til at virke. Men du må da gerne prøve igen om
>du kan se yderligere sikkerhedsbrister ved siden.

Såvidt, jeg kan se, tilføjer du bare ".inc" bagefter $body, og henter
den. Så følgende virker fx stadigvæk:
http://ravsted.net/index.php?body=http://www.jubii.dk/?

Det betyder tillige, at man kan gennemskue hvor nogle af dine
php-filer ligger (fx arkiv.inc) og tilgå dem direkte, uden at de
bliver fortolket som PHP. På den måde kan folk pt. få adgang til vital
information. Jeg overvejede at e-maile dig dette, men kunne ikke lige
lure din kontaktadresse.

Så sikkerheden er ikke øget specielt.

Som det allerførste bør du nok omdøbe dine .inc-filer til at hedde
..inc.php.

Derefter vil jeg anbefale dig at prøve at implementere fx den kode,
jeg gav et eksempel på i det tidligere svar. Her vælger php-koden selv
specifikt, hvad include-filnavnet skal være i de forskellige tilfælde
- og hvis brugeren ikke angiver nogen af de muligheder, så bliver der
ikke include'd noget.

--
- Peter Brodersen
php -r 'print floor(8.2-0.2);'
perl -le 'print 5-4.9;'

Andreas Falck (19-08-2004)
Kommentar
Fra : Andreas Falck


Dato : 19-08-04 08:01

I news:cfuisk$ko0$1@katie.ellegaard.dk skrev
Peter Brodersen følgende:

> Derefter vil jeg anbefale dig at prøve at implementere fx den kode,
> jeg gav et eksempel på i det tidligere svar. Her vælger php-koden
> selv specifikt, hvad include-filnavnet skal være i de forskellige
> tilfælde - og hvis brugeren ikke angiver nogen af de muligheder, så
> bliver der ikke include'd noget.

Jeg har forsøgt mig med den kode du gav i et tidligere indlæg, men jeg
kan ikke rigtig få det til at virke.

Jeg forstår det med koden sådan at der skal laves en case til hver
enkelt kald, - er dette rigtig forstået?

Og hvis det er rigtig forstået, kan man så ikke lægge alle disse i en
separat fil og lave kald til den (include eller noget i den stil), da
der vil blive rigtig mange af dem når site'et er færdigt til at blive
taget i brug.

Du er velkommen til at skrive til mig på adressen fake (@) skrift (.)
dk (fjern paranteser og mellemrum).

--
Med venlig hilsen Andreas Falck - ICQ 108 480 093
http://maranatha.dk/ + http://skabelsen.info/
http://bibeltro.dk/ + http://bibel-skole.dk/
http://ravsted.dk/ - *Byen hvor der virkelig sker noget*


Peter Brodersen (19-08-2004)
Kommentar
Fra : Peter Brodersen


Dato : 19-08-04 14:53

On Thu, 19 Aug 2004 09:01:17 +0200, "Andreas Falck"
<fake@skrift.dk.invalid> wrote:

>Jeg forstår det med koden sådan at der skal laves en case til hver
>enkelt kald, - er dette rigtig forstået?

Yep.

>Og hvis det er rigtig forstået, kan man så ikke lægge alle disse i en
>separat fil og lave kald til den (include eller noget i den stil), da
>der vil blive rigtig mange af dem når site'et er færdigt til at blive
>taget i brug.

Det kan man sagtens, men... det lader da til at det altid er
index.php-filen, der bliver kaldt.

Men nej, det er intet problem at flytte den del af koden ud i en
selvstændig fil og så include den.

--
- Peter Brodersen
php -r 'print floor(8.2-0.2);'
perl -le 'print 5-4.9;'

Andreas Falck (19-08-2004)
Kommentar
Fra : Andreas Falck


Dato : 19-08-04 15:23

I news:cg2bc5$d8r$1@katie.ellegaard.dk skrev
Peter Brodersen følgende:

>> Og hvis det er rigtig forstået, kan man så ikke lægge alle disse i
>> en separat fil og lave kald til den (include eller noget i den
>> stil), da der vil blive rigtig mange af dem når site'et er færdigt
>> til at blive taget i brug.
>
> Det kan man sagtens, men... det lader da til at det altid er
> index.php-filen, der bliver kaldt.

Du foreslår at det gøres i index.php-filen, hvis jeg forstod dig
rigtigt.

Der har jeg nu følgende kode:
<?php
if($inc != "")
{
$body = $inc . ".inc.php";
include($body);
}
else
{
include("forside.inc.php");
}
?>

Og så formoder jeg at denne kode skal udskiftes med den kode du
foreslog.

Du må undskylde at jeg bliver ved at spørge lidt dumt. Det er kun
forbi jeg endnu ikke har lært (og forstået) specielt meget af det her
med PHP og MySql. Synes dog selv at det bliver lidt bedre hele tiden,
omend det går langsomt.

--
Med venlig hilsen Andreas Falck - ICQ 108 480 093
http://maranatha.dk/ + http://skabelsen.info/
http://ravsted.dk/ - *Byen hvor der virkelig sker noget*
http://ravsted.net/ - *Lokalhistoriske sider*


Peter Brodersen (19-08-2004)
Kommentar
Fra : Peter Brodersen


Dato : 19-08-04 15:48

On Thu, 19 Aug 2004 16:23:19 +0200, "Andreas Falck"
<fake@skrift.dk.invalid> wrote:

>Du foreslår at det gøres i index.php-filen, hvis jeg forstod dig
>rigtigt.
>
>Der har jeg nu følgende kode:
[..]
>Og så formoder jeg at denne kode skal udskiftes med den kode du
>foreslog.

Lige præcis.

--
- Peter Brodersen
php -r 'print floor(8.2-0.2);'
perl -le 'print 5-4.9;'

Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408943
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste