Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Parameter übergeben (https://www.delphipraxis.net/111691-%5Bphp%5D-parameter-uebergeben.html)

Yheeky 7. Apr 2008 23:00


[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:
http://meine-Homepage.de/script.php?username=Test
Ich habe in der PHP Datei folgenden Code:
Code:
<?php
  include('server.php');

 $sqlabfrage = "SELECT * FROM user WHERE name='$username' ";

 $res = mysql_db_query($db, $sqlabfrage);
 $num = mysql_affected_rows();
     
 echo $sqlabfrage;
 
?>
In der Server.php stehen die Serverdaten.
Zum Testen habe ich mir die "sqlabfrage" also echo anzeigen lassen, doch egal, welchen Usernamen ich eingebe, es kommt immer folgende Ausgabe:

Code:
SELECT * FROM user WHERE name ''
Kann mir da jemand sagen, wieso nicht der übergebene Parameter angezeigt wird? Was mache ich da denn falsch?

freak4fun 7. Apr 2008 23:19

Re: [PHP] Parameter übergeben
 
Code:
$username = $_GET["username"];
$sqlabfrage = "SELECT * FROM user WHERE name='$username' ";
Aber dem Parameter darfst du nicht trauen, da musst du die EIngabe erst prüfen!

finalr 8. Apr 2008 00:28

Re: [PHP] Parameter übergeben
 
Noch eine kleine Anmerkung

Niemals den Parameter in einer SQL-Abfrage so einfügen:
Code:
$sql = "SELECT * FROM user WHERE name='".$_GET['username']."'";
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!

Gruss Daniel

TillWe 8. Apr 2008 09:01

Re: [PHP] Parameter übergeben
 
mysql_db_query($db, $sqlabfrage);
Hier muß (glaub ich?) erst der Query, dann die DB Verbindung.
Zitat:

Kann mir da jemand sagen, wieso nicht der übergebene Parameter angezeigt wird? Was mache ich da denn falsch?
Du zeigst nur den Query an, Du willst abe das Ergebnis anzeigen:
http://de.php.net/function.mysql-result
http://de.php.net/manual/de/function...-fetch-row.php
http://de.php.net/manual/de/function...etch-array.php
http://de.php.net/manual/de/function...etch-assoc.php
http://de.php.net/manual/de/function...tch-object.php

Wie die Vorposter schon gesagt haben solltest Du die Benutzereingaben nicht ungefiltert verwenden:
http://de.php.net/manual/de/function...ape-string.php

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

alcaeus 8. Apr 2008 09:52

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:
');DROP DATABASE bar;--
dann kommt in $_GET folgendes an:
Code:
\');DROP DATABASE bar;--
Falls ich dann nochmal mysql_real_escape_string() drueberlaufen lass, dann hab ich
Code:
\\\');DROP DATABASE bar;--
oder
Code:
\\');DROP DATABASE bar;--
Und wie mans dreht und wendet, das sind auf alle Faelle zuviele \ ;)

Deshalb: auf alle Faelle erstmal stripslashes() drueberlaufen lassen, wenn magic_quotes_gpc an ist (don't you just love it?)

Greetz
alcaeus

Yheeky 8. Apr 2008 13:27

Re: [PHP] Parameter übergeben
 
Okay, super.
Folgende Zeile funktioniert:

Code:
$username = $_GET["username"];
Warum ist das aber unsicher? Ich möchte doch nur anhand von einem Usernamen Daten auslesen...

Matze 8. Apr 2008 13:41

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='' ";

alcaeus 8. Apr 2008 15:02

Re: [PHP] Parameter übergeben
 
Zitat:

Zitat von Yheeky
Warum ist das aber unsicher? Ich möchte doch nur anhand von einem Usernamen Daten auslesen...

Siehe XKCD: "Exploits of a Mom"

Ueberleg dir einfach was passiert, wenn man so einen String ins Query reinhaut.

Greetz
alcaeus

Berlinermauer 8. Apr 2008 15:07

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:

rollstuhlfahrer 8. Apr 2008 15:53

Re: [PHP] Parameter übergeben
 
HI,

noch eine kleine Anmerkung

Code:
http://meine-Homepage.de/script.php?username=Test
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.

rollstuhlfahrer

DeddyH 8. Apr 2008 15:54

Re: [PHP] Parameter übergeben
 
Du meinst vermutlich REGISTER_GLOBALS. Aus Sicherheitsgründen sollte dieser Schalter false gestellt sein.

alcaeus 8. Apr 2008 17:04

Re: [PHP] Parameter übergeben
 
Zitat:

Zitat von DeddyH
Du meinst vermutlich REGISTER_GLOBALS. Aus Sicherheitsgründen sollte dieser Schalter false gestellt sein.

...und genau deshalb per Default aus, und in PHP 6 sogar nicht mehr vorhanden ist. Endlich ^^

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

DeddyH 8. Apr 2008 17:10

Re: [PHP] Parameter übergeben
 
Erst REGISTER_GLOBALS abschalten und dann $_REQUEST auswerten? Das passt IMHO nicht zusammen.

alcaeus 8. Apr 2008 17:12

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

DeddyH 8. Apr 2008 17:16

Re: [PHP] Parameter übergeben
 
Zitat:

Zitat von alcaeus
Wenn ich darauf bestehe, dass ich die Daten ueber POST kriege, verwende ich $_POST.

Ja eben, wenn ich ein POST-Formular definiere, denke ich mir doch meist etwas dabei. Es mag natürlich auch Situationen geben, in denen die Herkunft egal sein mag, aber das habe ich persönlich noch nie gehabt ;)

Yheeky 8. Apr 2008 19:21

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?

mkinzler 8. Apr 2008 19:28

Re: [PHP] Parameter übergeben
 
Bei GET werden sie Parameter als Teil der URL übertragen: http://www.server.tld/machwas.php?pa...1&param2=wert2
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.

Yheeky 8. Apr 2008 21:38

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?

mkinzler 8. Apr 2008 21:42

Re: [PHP] Parameter übergeben
 
Zitat:

Aber wenn ich das über mein Programm mit einer idHTTP Komponente verwende, dann geht doch nur $_GET oder?
Nein, es geht auch POST.
Hier im Forum suchenINDY POST

Yheeky 9. Apr 2008 08:18

Re: [PHP] Parameter übergeben
 
Okay, aber wie kann ich dann Parameter übergeben, ohne dass man sie verändern kann?

mkinzler 9. Apr 2008 08:20

Re: [PHP] Parameter übergeben
 
Wie meinst du das mit Verändern?

Yheeky 9. Apr 2008 08:34

Re: [PHP] Parameter übergeben
 
Wenn ich mein Script wiefolgt aufrufe:

Code:
http://meine-Homepage.de/Test.php?username='Test'&passwort='blablub'
Dann könnte jemand ja hingehen und die Eingabe verändern und womöglich Befehle wie DROP TABLE aufrufen:
z.B.:
Code:
http://meine-Homepage.de/Test.php?username=''
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:

Code:
$sqlabfrage = "SELECT * FROM user WHERE name='$username' ";
Weisst du nun was ich meine?

mkinzler 9. Apr 2008 08:44

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.

Yheeky 9. Apr 2008 09:09

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 ;-)

mkinzler 9. Apr 2008 09:11

Re: [PHP] Parameter übergeben
 
Zitat:

Was sollte man nicht machen?
parameter ungeprüft übernehmen.

http://www.phpcenter.de/de-html-manu...injection.html

Yheeky 9. Apr 2008 10:01

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?

alcaeus 9. Apr 2008 10:25

Re: [PHP] Parameter übergeben
 
Zitat:

Zitat von Yheeky
Okay, aber wie kann ich dann Parameter übergeben, ohne dass man sie verändern kann?

Erste Regel in der Webentwicklung: Parameter sind unsicher.
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

Yheeky 9. Apr 2008 11:15

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).

Yheeky 9. Apr 2008 12:12

Re: [PHP] Parameter übergeben
 
So, habe meine Idee jetzt mal umgesetzt:

Code:
<?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";
 }

?>
Das funktioniert doch so, oder? Habe eben getestet und es kommen nur zusammenhängende Strings durch...

alcaeus 9. Apr 2008 12:22

Re: [PHP] Parameter übergeben
 
Zitat:

Zitat von Yheeky
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.

Falsch. Betrachte alles was ankommt, als Muell. Dann sortierst du es (stripslashes falls magic_quotes an sind, htmlspecialchars, trim), und dann ueberlegst du ob du es verwenden willst und ob die Qualitaet passt (z.B. ob der Benutzername gewisse Kriterien erfuellt). Und merke: alles was du kriegst, sind Strings. Entweder du typisierst die Variablen selbst (z.B. intval() oder (int)) oder du musst jede Variable, die in ein Query kommt mit Quotes umgeben und mysql_real_escape_string drueberlaufen lassen. Bei Strings ist es naemlich straeflich, das nicht zu tun.

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:
get.php?username=';DROP%09TABLE%09Users;--
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)

Was hat htmlspecialchars() damit zu tun? Stell dir sowas vor:
Code:
$username = $_GET['username'];
// Abfrage
if ($not_exists)
{
  echo "Benutzer $username existiert nicht";
}
Und jetzt stell dir fuer $username diese Eingabe vor:
Code:
<script>alert(document.cookie);</script>
Da ist kein Leerzeichen drin, und glaub mir, man kann viel mehr Scheiss mit XSS-Luecken anstellen als nur ein Cookie auszugeben.

Greetz
alcaeus

Yheeky 9. Apr 2008 12:40

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...

DeddyH 9. Apr 2008 12:42

Re: [PHP] Parameter übergeben
 
Lies mal: http://www.phpcenter.de/de-html-manu...pe-string.html

Yheeky 9. Apr 2008 13:09

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)... :-/

DeddyH 9. Apr 2008 13:13

Re: [PHP] Parameter übergeben
 
Wieso sollte die Funktion auf Leerzeichen reagieren?

Yheeky 9. Apr 2008 14:51

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?

Yheeky 9. Apr 2008 16:38

Re: [PHP] Parameter übergeben
 
Mhmm, was ist mit?

Code:
<?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);
}
 
?>
Würde das funktionieren?

DeddyH 9. Apr 2008 16:41

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.

Yheeky 9. Apr 2008 17:05

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...

DeddyH 9. Apr 2008 17:06

Re: [PHP] Parameter übergeben
 
Dann heißt der Benutzer eben DROP TABLE :zwinker:

alcaeus 9. Apr 2008 17:18

Re: [PHP] Parameter übergeben
 
Zitat:

Zitat von Yheeky
wenn ich eine Eingabe wie "DROP TABLE" unterlassen will.

Junge, lies doch mal was ich sag:

Zitat:

Zitat von alcaeus
Versuch nicht zu verhindern, dass ein Benutzer SQL-Queries mitschickt. Verhindere, dass diese zur Ausfuehrung kommen

Zur Not kannst du dem Benutzer ja auch sagen, dass er keine SQL-Statements eingeben soll. Dann wird er es aber erst recht tun...

Was ist der Unterschied zwischen den beiden Queries:
SQL-Code:
SELECT * FROM users WHERE username='';DROP TABLE users;--';
SQL-Code:
SELECT * FROM users WHERE username='\';DROP TABLE users;--';
Richtig, bei einem wird das eingegebene Statement ausgefuehrt, beim anderen nicht, weil das Quote escaped ist.

Greetz
alcaeus


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:53 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz