Problem mit Übergabe von Variablen

Alles, was PHP betrifft, kann hier besprochen werden.

Problem mit Übergabe von Variablen

Postby deiszner » 19. June 2007 23:45

Hallo,

php save mode on
register globals off

ich habe eine Ausgabe von Artikeln, in der Datenbank mit id bezeichnet.

Normalerweise würde ich ja in die list.php schreiben

<p><a href="ausgabe.php?<;? echo $row->id; ?>">Presseartikel</a></p>

Aber das geht ja nicht mehr.

Wie bekomme ich die ID in die ausgabe.php ?

gruß

Sebastian
Alles schöne am Leben hat einen Haken. Es ist unmoralisch, illegal oder es macht dick.
deiszner
 
Posts: 129
Joined: 30. December 2002 12:18
Location: Leipzig

Postby Wiedmann » 20. June 2007 00:21

Aber das geht ja nicht mehr.

Wieso nicht?
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby KingCrunch » 20. June 2007 00:23

Sry, aber dein ganzer Beitrag ergibt keinen Sinn!

Natürlich geht deine Ausgabe so, solange $row definiert ist und eine Eigenschaft id besitzt, das hat aber weder etwas mit safe_mode nocht mit register_globals zu tun.

Wenn es also nicht geht, lieber mal prüfen, was in $row so drin steht ;)
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby kschroeder » 20. June 2007 07:10

Ich denke mal, er meint, dass das Problem bereits bei der Übergabe der Werte bestehen würde.

Mal abgesehen, dass im Beispielcode noch Fehler drin sind:
Code: Select all
<;? echo $row->id; ?>


Schätze, das Semikolon hier <;? ist nur ein Tippfehler.
Man kann aber auch kurz
Code: Select all
<?=$row->id;?>
schreiben.

Grundsätzlich sollte aber auch ein Variablenname übergeben werden:

Code: Select all
<p><a href="ausgabe.php?id=<?=$row->id;?>">Presseartikel</a></p>


Man bemerke das "id="

In der ausgabe.pgp kann jetzt aber nicht mehr direkt auf $id zugegriffen werden, sondern muss über $_POST["id"] bzw. $_GET["id"] referenziert werden.
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Postby deiszner » 20. June 2007 13:27

Ich habe mich falsch ausgedrückt:

anzeigen.php hat folgenden Inhalt

<a href="ausgabe.php?id=25">ausgabe</a>

die ausgabe.php hat folgenden Inhalt

<? echo $_GET["id"]; ?>

Nach Klick auf den Link 'ausgabe' gibt er mir 25 aus.

AABER:
Ein 'böser' könnte ja aus dem id=25 eine id=123 machen.....

Meine Frage dreht sich darum: Wie kann ich Variablen übergeben, so daß sie nicht manipuliert werden können....
Alles schöne am Leben hat einen Haken. Es ist unmoralisch, illegal oder es macht dick.
deiszner
 
Posts: 129
Joined: 30. December 2002 12:18
Location: Leipzig

Postby Wiedmann » 20. June 2007 13:35

Ein 'böser' könnte ja aus dem id=25 eine id=123 machen.....

Was hätte er davon? (dann sieht er halt nicht Artikel Nr. 25 sondern Nr. 123...)

Wie kann ich Variablen übergeben, so daß sie nicht manipuliert werden können....

Ansonsten nimmt man dafür Sessions.
Wiedmann
AF Moderator
 
Posts: 17102
Joined: 01. February 2004 12:38
Location: Stuttgart / Germany

Postby kschroeder » 20. June 2007 14:09

Wäre es nicht ebenfalls sicherer, wenn man die Werte anstatt über GET über POST überträgt?

Ist natürlich mehr Programmieraufwand, aber wenn man dann noch abfragt, welche Seite aufgerufen hat, sollte man doch einen deutlichen Schritt in Richtung Sicherheit getan haben, oder?
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Postby KingCrunch » 20. June 2007 14:45

Nein, GET und POST sind beide unsicher.

Um an deiszner anzuknüpfen: Was hat der Nutzer davon, wenn er statt Artikel 1 eben Artikel 325 aufruft? Im schlimmsten Fall eine "Artikel nicht gefunden" Seite. Wenn es allerdings wirklich sicherheitskritisch ist, dann verwendet kein GET, POST oder COOKIE, weil die eh alle auffn Client landen und somit als unsicher einzustufen sind. SESSION dürfte dir weiter helfen.
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby kschroeder » 20. June 2007 18:05

Die Post-Daten landen zwar auf dem Client, sollten aber nicht doch nicht manipulierbar sein, oder? Eine ID zu kennen ist ja die eine Sache, aber CodeInjektion ist wieder eine andere, oder?
Hab mir (leider) bisher noch nicht allzuviele Gedanken bezüglich Sicherheit machen müssen.
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Postby KingCrunch » 20. June 2007 20:37

kschroeder wrote:Die Post-Daten landen zwar auf dem Client, sollten aber nicht doch nicht manipulierbar sein, oder? Eine ID zu kennen ist ja die eine Sache, aber CodeInjektion ist wieder eine andere, oder?
Hab mir (leider) bisher noch nicht allzuviele Gedanken bezüglich Sicherheit machen müssen.
Verwechselst du da etwas?

POST-Daten landen als Klartext im HTML-Quelltext. Eine ID existiert da nicht ;)

Möglicherweise meinst du Sessions ^^
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby kschroeder » 21. June 2007 08:46

Auch auf die Gefahr hin, mich unendlich zu blamieren...

Nehmen wir mal an, der dargestellte Inhalt der index.php ist abhängig von der Variable ID.
Bei ID=1 wird eine normale Seite mit Login angezeigt, bei erfolgreichem Login ID=2 mit ganz geheimen Sachen ;)

Wenn die Seite aufgerufen wird und der Wert von ID über POST und nicht über GET und die Seite überprüft, von welcher Seite der Aufruf erfolgt ist...
dann kann ich zwar sehen, dass die Variable ID existiert, die im Normalfall den Wert 1 hat, aber es ist mir doch nicht möglich, den Wert nach eigenem Wunsch zu manipulieren, oder?
kschroeder
 
Posts: 254
Joined: 11. May 2007 13:33

Postby KingCrunch » 21. June 2007 09:03

Dochdoch, natürlich ^^

POST wird in der Regel von Browser in Form eines Formulars mit bestimmten Target dargestellt. Nun ist es doch problemlos möglich die Datei als HTML zu speichern, die eingesetzten Formularfelder zu ändern und dann das Formular trotzdem an das urpsprüngliche Target abschicken.

Der PHP-Datei ist es egal, welche Seite das Formular abgeschickt hat, insofern kann man sich da leicht was eigenes basteln.
Nicht jeder Fehler ist ein Bug ...
KingCrunch
 
Posts: 1724
Joined: 26. November 2005 19:25

Postby Knight1 » 22. June 2007 14:56

Hi all,
wenn die ID zur Bestimmung eines bestimmnten Datensatzes in einer (MySQL-)Datenbank benötigt wird solte schon eine Überprüfung stattfinden. Wie KingCrunch auch schon in mehreren Beiträgen treffend bemerkt hat sind alle Daten welche per GET, POST oder COOKIE kommen manipulierbar und damit böse.

Das PHP-Manual kann die Thematik SQL-Injection besser als ich erklären: http://www.php.net/manual/de/security.d ... ection.php


Für denn Fall dass die ID immer einen nummerischen Wert, also eine Zahl, erwartet, kann man eine einfach Überprüfung per is_nummeric() durchführen. Mit einer vernünftigen if-Bedingung kann man dann eine eventuelle nicht Nummerische ID-Übergabe abfangen und somit garnicht erst bis zur DB-Abfrage durchlassen.



Ich hoffe ich konnte etwas zur Klärung beitragen.




Kai aka Knight1
Image
User avatar
Knight1
 
Posts: 310
Joined: 18. October 2003 10:03
Location: Trier
Operating System: Windows 7 Ultimate x64


Return to PHP

Who is online

Users browsing this forum: No registered users and 16 guests