Nur bestimmte Variablen zulassen - Wie ?? |
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Kontrollierte Variablenübergabe von einem script zum nächsten ist mein Problem. Ich will meine Seite ja nur sicher vor Hackern machen.
ich lese also die übergebene Varialbe mit $_get ein, vergleiche diese mit "konstanten"
in der form
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17: | $var = $_Get['var'];
switch ($var)
{
case 0:
if ($var == home.php) {include ($var)}
break;
case 1:
if ($var == news.php) {include ($var)}
break;
.
.
.
.
case 323454:
if ($var == wasweißich.php) {include ($var)}
break;
} |
Aber das scheint mir extrem unkomfortabel zu sein. Es kann doch nicht sein, daß ich - um auf Nummer Sicher zu gehen - den Inhalt von $var wirklich mit allen denkbaren zu includenden Dateien vergleichen muss. Da muss es doch was einfacheres geben. Und das ist mein Problem: WAS IST EINFACHER ALS DAS ??
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
Diese Nachricht wurde geändert von: dee123 |
 Profil
Website
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Achso, du wilslt nur den Inhalt einer Variable kontrollieren, in der ein Seitenname steht?
Dann kannst du dir ein Array machen: $sites = array('home.php', 'foo,php', ...); und dann mit in_array(); überprüfen, ob der Inhalt der übergeben wird halt in dieser Liste enthalten ist. Wenn ja includen, wenn nicht halt Fehlermeldung.
|
 Profil
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Hi languitar,
wäre das auch eine Möglichkeit, oder isses zu unsicher ??
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18: |
$verz=opendir ('.');
while ($file = readdir ($verz))
{
$end = split("[.]", $file);
if ($end[1] == "php" || $end[1] == "html" || $end[1] == "pdf")
{
$inc = $end[0].".".$end[1]."
";
include ($inc);
}
}
closedir($verz);
|
Ich hab nämlich eine ungemeine Anzahl von Dateien, die includiert werden. und die alle in ein Array zu schreiben, da sind sicherlich Fehler vorprogammiert.
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
Diese Nachricht wurde geändert von: dee123 |
 Profil
Website
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Das funktioniert solange deine dateien nur einen Punkt im Namen haben, wenn du daran halt die Abfrage mit dem inarray anknüpfst geht das. So machst du ja gar keine Abfrage.
|
 Profil
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
http://de2.php.net/inarray
Lässt halt alle deine Dateien mit der Schleife in das Array schreiben...
|
 Profil
Editieren
Zitieren
|
Lewi
Quasselstrippe
Beiträge: 287 |
Wobei du bei 'hunderten' zu inkludierenden Dateien vielleicht mal dein System überdenken und ggf. auf eine Template-Engine wie smarty (smarty.php.net) umstellen solltest. Dann hast du auch (fast) keinen Sicherheits-Stress mehr.
---
Lewi = ehemals the_doc
|
 Profil
Website
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Hallo Nochmal,
Dank an languitar für den "in_array" Tip.
habs jetzt so versucht:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: | $var_in = $_GET['var'];
$n = 0;
$verz=opendir ('.');
while ($file = readdir ($verz))
{
$end = split("[.]", $file);
if ($end[1] == "php" || $end[1] == "html" || $end[1] == "pdf")
{
$inc = $end[0].".".$end[1];
$array[$n] = $inc;
$n = $n + 1;
}
}
closedir($verz);
if (in_array ($var_in, $array))
{
include ($var_in);
} |
Hoffe, das es so in Ordnung ist.
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
|
 Profil
Website
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Das müsste so funktionieren, ich würde nur noch einen Else-Part einbauen, mit einer Fehlermeldung und in der While-Schleife musst du das Array nicht explizit durchnumerieren. Das macht PHP auch alleine. $array[] = 'dateiname' würde schon reichen. Damit könntest du dir die Zählvariable sparen.
|
 Profil
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
tzzz....
wer sendet schon die include per get....
sowas macht absolut kein sinn.... wenn du das als lösung hast, solltest
mal dein script überdenken
---
Irren is Menschlich
Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!
Kameradschaft ist, wenn der
Kamerad schafft !!!!
|
 Profil
Editieren
Zitieren
|
TeX
Otto-Normal-Poster
Beiträge: 51 |
Jop, halt ich auch für schwachsinn, aber wenn Du das so brauchst dann lass die Datei auf existenz prüfen in einem festen Pfad wo keine Verzeichnisrechte ala 777 drauf sind, dann kann der hacker da nichts machen, weil er keine Dateien dahin bekommt.
Ich habe sowas in der Art für nen Portal mal gemacht:
index.php?func=reg - das wird per Link aufgerufen
Ich hab dann nur ne Prüfung dadrin, ob die Datei vorkommt:
1: | if(file_exists("php/".$_GET[func].".php")){include("php/".$_GET[func].".php");} |
---
Ankauf leere Toner | Ankauf leere Tonerkartuschen
|
 Profil
E-Mail
Website
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
Für die Strings (Arrayschlüssel) fehlen die Quotes und es ist unsicher. Man kann nämlich einfach mit "../../" aus dem Verzeichnis php rausgehen. Bei dieser Variante sollte die $_GET['func']-Variable so behandelt werden, das nur der Teil ab dem letzten / genutzt wird.
Besser ist jedoch ein Whitelist-Array mit allen erlauben Werten. dee123 baut dieses Array ja jetzt durch das einlesen des Verzeichnisses auf. Performancemäßig eventuell nicht gerade toll, aber dafür sicher.
---
Weaverslave
|
 Profil
Website
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
nunja, nen listing zu machen, welche dateien wirklich in einem verzeichnis liegen
ist ja nun nicht so performance raubend...
er wird ja nicht unzälige dateien dort drin haben...
letztendlich, sollte man vorher drüber nachdenken, wie man was löst,
um genau sowas zu vermeiden
was auch noch gehen würde, da die abfrage schneller ist....
mach dir doch ne tabelle und lass über nen script, alle dateien eintragen, die du
(brauchst) --> spinn spinn.....
könntest jetz noch nen md5 aus dem dateinamen generieren und diesen dann
benutzen, um den wirklichen dateinamen aus dem sql[array] zu lesen
dürfte bei vielen dateien der schnellste und sicherste weg sein.....
---
Irren is Menschlich
Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!
Kameradschaft ist, wenn der
Kamerad schafft !!!!
|
 Profil
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
ich hab es jetzt so gelöst:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: | $var_in = $_GET['var'];
$array_file = array();
$dir=opendir (".");
while ($file = readdir ($dir))
{
$end = split("[.]", $file);
if ($end[1] == "php" || $end[1] == "html" || $end[1] == "pdf")
{
$inc = $end[0].".".$end[1];
array_push ($array_file, $inc);
}
}
closedir($dir);
if (isset ($var_in) && in_array ($var_in, $array_file))
{
include ($var_in);;
}
else
{
include ("Home.php");
} |
Achja, @TEX: Schwachsinn ist, wenn du nach einer existierenden Datei fragst ( if(file_exists...) wenn doch alle dateien per readdir ins Array geschrieben worden.
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
|
 Profil
Website
Editieren
Zitieren
|
TeX
Otto-Normal-Poster
Beiträge: 51 |
Naja den ganzen Quatsch könntest Du Dir durch 2 Zeilen Code sparen.
Wenn Du das so machen willst haste genau das Prob was "subjective" beschrieben hat:
1: | $_GET['var']="http://domain/bot.php"; |
Wenn ich nun mein Verzeichnis da wo mein BOT liegt für durchsuchen freigebe, naja n8.
1:
2:
3:
4: |
$_GET[var] ab den letzten / auslesen;
if(file_exists("php/".$_GET[var].".php")){include("php/".$_GET[var].".php");}
|
Du könntest noch die erlaubten Endungen in nen Array speichern, aber diese Möglichkeit sollte wohl die schnellste sein, da nur eine Datei geprüft wird.
---
Ankauf leere Toner | Ankauf leere Tonerkartuschen
|
 Profil
E-Mail
Website
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
Es gibt bei jeder Art von Escaping/Absicherung die nur auf Zeichen gibt eine potentielle Möglichkeit sie zu umgehen. Daher ist die Whitelist eine deutlich bessere Idee.
Soweit ich es jedoch sehe ist die aktuelle Lösung sicher. Es wird eine Liste der Dateien in einem bestimmten Verzeichnis aufgebaut. Nur wenn die Datei in diesem Array vorhanden ist, wird sie eingebunden.
Elegant kann eine Lösung, welche GET-Param statt Dateinamen nutzt, nie sein.
---
Weaverslave
|
 Profil
Website
Editieren
Zitieren
|