![]() |
[PHP] Parameter übergeben
Hey,
ich habe folgendes Problem: Ich habe ein PHP Script und möchte dies gerne mit einem Parameter aufrufen. Der Aufruf sieht wiefolgt aus:
Code:
Ich habe in der PHP Datei folgenden Code:
http://meine-Homepage.de/script.php?username=Test
Code:
In der Server.php stehen die Serverdaten.
<?php
include('server.php'); $sqlabfrage = "SELECT * FROM user WHERE name='$username' "; $res = mysql_db_query($db, $sqlabfrage); $num = mysql_affected_rows(); echo $sqlabfrage; ?> Zum Testen habe ich mir die "sqlabfrage" also echo anzeigen lassen, doch egal, welchen Usernamen ich eingebe, es kommt immer folgende Ausgabe:
Code:
Kann mir da jemand sagen, wieso nicht der übergebene Parameter angezeigt wird? Was mache ich da denn falsch?
SELECT * FROM user WHERE name ''
|
Re: [PHP] Parameter übergeben
Code:
Aber dem Parameter darfst du nicht trauen, da musst du die EIngabe erst prüfen!
$username = $_GET["username"];
$sqlabfrage = "SELECT * FROM user WHERE name='$username' "; |
Re: [PHP] Parameter übergeben
Noch eine kleine Anmerkung
Niemals den Parameter in einer SQL-Abfrage so einfügen:
Code:
Sonst besteht die Gefahr einer SQL-Injection, also immer den Parameter auf Gültigkeit überprüfen und nie den Parameter direkt in einer Abfrage einbauen!
$sql = "SELECT * FROM user WHERE name='".$_GET['username']."'";
Gruss Daniel |
Re: [PHP] Parameter übergeben
mysql_db_query($db, $sqlabfrage);
Hier muß (glaub ich?) erst der Query, dann die DB Verbindung. Zitat:
![]() ![]() ![]() ![]() ![]() Wie die Vorposter schon gesagt haben solltest Du die Benutzereingaben nicht ungefiltert verwenden: ![]() Außerdem ist es besser SELECT username, ... anstatt SELECT * zu schreiben. Vielleicht solltest Du noch überlegen ob der Username wirklich in die URL gehört (weiß ja nicht was Du machen willst) vl. wäre es besser ihn über POST oder so zu senden?! mfg |
Re: [PHP] Parameter übergeben
Jetzt kommt aber der Spass....falls magic_quotes_gpc an ist, darf man nicht ohne weiteres mysql_real_escape_string drueberlaufen lassen. Nehmen wir an ein User gibt das ein:
Code:
dann kommt in $_GET folgendes an:
');DROP DATABASE bar;--
Code:
Falls ich dann nochmal mysql_real_escape_string() drueberlaufen lass, dann hab ich
\');DROP DATABASE bar;--
Code:
oder
\\\');DROP DATABASE bar;--
Code:
Und wie mans dreht und wendet, das sind auf alle Faelle zuviele \ ;)
\\');DROP DATABASE bar;--
Deshalb: auf alle Faelle erstmal stripslashes() drueberlaufen lassen, wenn magic_quotes_gpc an ist (don't you just love it?) Greetz alcaeus |
Re: [PHP] Parameter übergeben
Okay, super.
Folgende Zeile funktioniert:
Code:
Warum ist das aber unsicher? Ich möchte doch nur anhand von einem Usernamen Daten auslesen...
$username = $_GET["username"];
|
Re: [PHP] Parameter übergeben
Man kann damit das Query manipulieren:
Wenn $username bsp. das hier ist: ' OR 1=1 OR name=' Dann wird deutlich zu viel ausgelesen. Natürlich kann man auch anderes damit anstellen.
Code:
$sqlabfrage = "SELECT * FROM user WHERE name='' OR 1=1 OR name='' ";
|
Re: [PHP] Parameter übergeben
Zitat:
![]() Ueberleg dir einfach was passiert, wenn man so einen String ins Query reinhaut. Greetz alcaeus |
Re: [PHP] Parameter übergeben
ja dann könnte man dein Passwort leicht überschreiben oder überhaupt, natürlich kann man das auch nur wenn man weiß wie deine Tabbelen heißen aber wenn die daten aus phpbb kommen... '); CREATE Where(Name='NOOB' Password='angegebener Hash' Rang='1');
Syntax nicht ganz korrekt und Rang und so gibts nicht... ich will die SKs nicht dazu verleiten...^^ :angel2: |
Re: [PHP] Parameter übergeben
HI,
noch eine kleine Anmerkung
Code:
Die dazugehörige PHP-Variable heißt tatsächlich $username. Um aber an diese heranzukommen muss man in der PHP.Ini ne kleine Änderung vornehmen. Selbst nach einem kleinen Studium einer Beispiel PHP.ini hab ich zwar den Schalter nicht gefunden, bin mir aber 100%tig sicher, dass es ihn gibt.
http://meine-Homepage.de/script.php?username=Test
rollstuhlfahrer |
Re: [PHP] Parameter übergeben
Du meinst vermutlich REGISTER_GLOBALS. Aus Sicherheitsgründen sollte dieser Schalter false gestellt sein.
|
Re: [PHP] Parameter übergeben
Zitat:
BTW, wenn du die Daten ueber ein Formular an das Script schickst, welches mit post arbeitet, wirst du in $_GET nichts finden. In dem Fall musst du $_POST nehmen. Alternativ kannst du auch $_REQUEST nehmen, dort sind $_GET, $_POST und $_COOKIE vertreten :) Greetz alcaeus |
Re: [PHP] Parameter übergeben
Erst REGISTER_GLOBALS abschalten und dann $_REQUEST auswerten? Das passt IMHO nicht zusammen.
|
Re: [PHP] Parameter übergeben
Warum...wenn man keinen Wert darauf legt, wo die Daten herkommen, ist es egal. Wenn ich darauf bestehe, dass ich die Daten ueber POST kriege, verwende ich $_POST. Wenn es allerdings egal ist (z.B. ob die sid aus $_GET, $_POST oder $_COOKIE kommt) kann ich genausogut $_REQUEST nehmen.
Greetz alcaeus |
Re: [PHP] Parameter übergeben
Zitat:
|
Re: [PHP] Parameter übergeben
Ähh, sorry aber nun komme ich nicht mehr mit. Ist es wirklich so schwer eine einfache (sichere) Abfrage zu machen? Kennt jemand vielleicht ein Tutorial oder eine Seite, mit der ich lernen kann? Vielleicht auch mit Beispielen um mir zu zeigen, wie ich das angehen muss?
Das mit $_GET, $_POST etc. und REGISTER_GLOBAL ist mir irgendwie nicht ganz klar *gg*...wäre natürlich auch super, wenn ihr hier näher darauf eingehen könntet ;-) Andere Frage: Wie würde bei euch denn eine einfache Login-Anfrage aussehen? Zur Info: Ich möchte aus meinem Programm heraus über die idHTTP Komtponente die Scripts auslesen. Die eigentlichen Pfade sieht man also nicht, kann man aber sicherlich zur Laufzeit auslesen, richtig? |
Re: [PHP] Parameter übergeben
Bei GET werden sie Parameter als Teil der URL übertragen:
![]() Bei POST nicht. Deshlab ist GET etwas leichter angreifbar. Bei aktivierten register_global werden die Parameter automatisch auf Variablen gemappt: z.B. $param1 hat dann wert1. Kennt man die Variablennamen oder errät sie, kann man so durch hizufügen von Parametern Werte überschreiben. |
Re: [PHP] Parameter übergeben
Aber wenn ich das über mein Programm mit einer idHTTP Komponente verwende, dann geht doch nur $_GET oder?
Hat jemand Beispiele für mich? |
Re: [PHP] Parameter übergeben
Zitat:
![]() |
Re: [PHP] Parameter übergeben
Okay, aber wie kann ich dann Parameter übergeben, ohne dass man sie verändern kann?
|
Re: [PHP] Parameter übergeben
Wie meinst du das mit Verändern?
|
Re: [PHP] Parameter übergeben
Wenn ich mein Script wiefolgt aufrufe:
Code:
Dann könnte jemand ja hingehen und die Eingabe verändern und womöglich Befehle wie DROP TABLE aufrufen:
http://meine-Homepage.de/Test.php?username='Test'&passwort='blablub'
z.B.:
Code:
Das Problem ist, dass ich die Parameter übergeben muss, weil ich die php Datei über mein Programm aufrufe. In der PHP Datei sieht der SQL Befehl ja wiefolgt drin:
http://meine-Homepage.de/Test.php?username=''
Code:
Weisst du nun was ich meine?
$sqlabfrage = "SELECT * FROM user WHERE name='$username' ";
|
Re: [PHP] Parameter übergeben
Das sollte man halt nicht machen, ist aber keine Problem der Werteübergabe sondern die ungeprüfte Übernahme dieser in Abfragen.
|
Re: [PHP] Parameter übergeben
Was sollte man nicht machen?
Ich weiss, ich würde das ja auch gerne abfragen, aber ich kenne die ganzen Befehle nicht so gut und ich weiss nicht, auf was ich alles achten soll. Im Grund lasse ich keinen Username mit Leerzeichen zu, von daher würde das schonmal in die Abfrage reinkommen. Ansonsten weiss ich aber nicht, inwiefern man da noch irgend ne Lücke ausfindig machen kann, das wäre halt schon blöd ;-) |
Re: [PHP] Parameter übergeben
Zitat:
![]() |
Re: [PHP] Parameter übergeben
Okay, danke für den Link. Der erklärt schonmal das Grundprinzip. Im Grunde brauche ich beim Parameter nur nach Leerzeichen prüfen, weil ein Username einen solchen nicht enthalten darf. Oder fällt irgend jemandem eine Sicherheitslücke auf?
|
Re: [PHP] Parameter übergeben
Zitat:
Zweite Regel: traue keinem User. Dritte Regel: validiere jede Eingabe und sichere sie ab. Um es kurz zu sagen: gar nicht, ich kann dir jeglichen Muell mitgeben, und du kannst nichts dagegen machen. Auch Cookies oder Browser-Variablen (User-Agent, Referrer, usw.) sind nicht davor sicher. Also geh einfach davon aus dass du nur Muell kriegst, und bau deine Anwendung so dass sie auch Muell schluckt. Dann machts auch nichts aus wenn dir jemand mal ein bisschen was perverseres mitgibt. Kleiner Tipp noch: htmlspecialchars(). Kam bis jetzt noch nicht auf und ist mindestens genauso wichtig. Greetz alcaeus |
Re: [PHP] Parameter übergeben
Dass ich die Eingaben nicht verhindern kann ist klar, aber es geht mir ja genau um dein 3.: ich will, dass "Müll" nicht weiter erkannt und weiter verarbeitet wird. Inwiefern da htmlspecialchars helfen soll, habe ich leider nicht verstanden.
Sorry, aber ich habe noch nicht wirklich viel mit PHP gemacht. War anfangs sogar stolz auf mein funktionierenden Login-Script, aber leider ist das keineswegs sicher :-( Nochmal die Frage: kann ich nicht einfach einen Parameter auf Leerzeichen überprüfen? Das würde mir glaube ich schon helfen, weil ein Username und ein Passwort keine Leerstellen enthalten darf (kann ich einfach über mein Programm abfragen). |
Re: [PHP] Parameter übergeben
So, habe meine Idee jetzt mal umgesetzt:
Code:
Das funktioniert doch so, oder? Habe eben getestet und es kommen nur zusammenhängende Strings durch...
<?php
include('server.php'); $username = $_GET["username"]; $passwort = $_GET["password"]; $leerstelle = ' '; $usernamePos = strpos($username, $leerstelle); $passwortPos = strpos($passwort, $leerstelle); // Prüfen, ob $username oder $passwort ein Leerzeichen enthält if ($usernamePos === false AND $passwortPos === false) { $sqlabfrage = "SELECT * FROM Tabelle WHERE name='$username' AND password='$passwort' "; echo $sqlabfrage; $res = mysql_db_query($db, $sqlabfrage); $num = mysql_affected_rows(); if ($num > 0) { echo "User gefunden!"; $username = mysql_result($res, 0, "name"); } else { echo "User nicht gefunden!"; } } else { echo "Fehlerhafte Eingabe"; } ?> |
Re: [PHP] Parameter übergeben
Zitat:
Zum Code sag ich nur, OUCH. Nicht nur Spaces sind blanks, da gibts noch viel mehr. Wie gesagt, mit mysql_real_escape_string() escapen. Folgender Query-String:
Code:
Kommt durch deine Pruefung durch, aber macht trotzdem scheisse. Und was machst du wenn der Benutzer ein Leerzeichen in seinem Passwort haben will? Oder wenn er einen Titel fuer einen Blog-Eintrag oder ne Support-Mail in ein Formular eingibt? Versuch nicht zu verhindern, dass ein Benutzer SQL-Queries mitschickt. Verhindere, dass diese zur Ausfuehrung kommen, indem du Quotes usw. unschaedlich machst (siehe obige Funktion)
get.php?username=';DROP%09TABLE%09Users;--
Was hat htmlspecialchars() damit zu tun? Stell dir sowas vor:
Code:
Und jetzt stell dir fuer $username diese Eingabe vor:
$username = $_GET['username'];
// Abfrage if ($not_exists) { echo "Benutzer $username existiert nicht"; }
Code:
Da ist kein Leerzeichen drin, und glaub mir, man kann viel mehr Scheiss mit XSS-Luecken anstellen als nur ein Cookie auszugeben.
<script>alert(document.cookie);</script>
Greetz alcaeus |
Re: [PHP] Parameter übergeben
Mhmm, also ich weiss immer noch nicht genau was mir mysql_real_escape_string da weiterhilft...dann habe ich ja nur "/"-Zeichen davor...
|
Re: [PHP] Parameter übergeben
|
Re: [PHP] Parameter übergeben
D.h. vor jedes nicht zulässige Zeichen wird ein "\" gesetzt. Aber bei Leerstellen reagiert die Funktion nicht (es wird ignoriert)... :-/
|
Re: [PHP] Parameter übergeben
Wieso sollte die Funktion auf Leerzeichen reagieren?
|
Re: [PHP] Parameter übergeben
Ich meine nicht, dass sie das sollte, aber so etwas brauche ich ja, wenn ich eine Eingabe wie "DROP TABLE" unterlassen will.
Klar, wenn ich Leerzeichen allgemein in Username und Passwort erlauben will, wird´s etwas schwieriger. Dann muss ich die Ausdrücke parsen, um den Aufruf zu verhindern? |
Re: [PHP] Parameter übergeben
Mhmm, was ist mit?
Code:
Würde das funktionieren?
<?php
include('server.php'); $username = isset($_GET['username']) ? $_GET['username'] : ''; $password = isset($_GET['password']) ? $_GET['password'] : ''; if ($username && $password) { $sql = 'SELECT * FROM user WHERE name = "' . mysql_real_escape_string($username) . '" AND password = "' . mysql_real_escape_string($password) . '"'; $result = mysql_query($sql); } ?> |
Re: [PHP] Parameter übergeben
Das sollte so gehen. Allerdings würde es auch genügen, in der Abfrage nur die Anzahl der passenden Datensätze zu ermitteln, aber das ist ein anderes Thema.
|
Re: [PHP] Parameter übergeben
Okay super!
Jetzt könnte doch aber trotzdem noch DROP TABLE eingegeben werden. Wieso wird das nun nicht ausgeführt? Stimmt, die Anzahl der Datensätze würde in dem Fall ausreichen... |
Re: [PHP] Parameter übergeben
Dann heißt der Benutzer eben DROP TABLE :zwinker:
|
Re: [PHP] Parameter übergeben
Zitat:
Zitat:
Was ist der Unterschied zwischen den beiden Queries:
SQL-Code:
SELECT * FROM users WHERE username='';DROP TABLE users;--';
SQL-Code:
Richtig, bei einem wird das eingegebene Statement ausgefuehrt, beim anderen nicht, weil das Quote escaped ist.
SELECT * FROM users WHERE username='\';DROP TABLE users;--';
Greetz alcaeus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz