1.6k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von mich-2 Einsteiger_in (21 Punkte)
Hallo,

nach einem Server-Umzug (vermutlich auch auf das neueste php) funktionierte mein Skript
$result = mysql_query("SELECT * FROM news WHERE newsid='$newsid' ",$connect);
nur mehr, wenn ich in der .htaccess-Datei
php_flag register_globals on
eingetragen habe.

Jetzt habe ich erfahren, daß dies nicht ungefährlich ist, weil man über die Variablen (newsid) in der URL angeblich die Datenbank manipulieren kann.

Wie kann ich meine Abfrage gestalten ohne daß das

php_flag register_globals
auf "on" gestellt ist ?

Für eine (hoffentlich möglichst einfache...) Hilfe wäre ich dankbar !
Mich

4 Antworten

0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
1. Unter allen aktuellen PHP-Versionen stehen die per URL übergebenen Werte in dem Array $_GET zur Verfügung. Statt $newsid mußt du nun $_GET['newsid'] schreiben.

2. Daten von externen Quellen (z.B. aus der URL, Formulardaten usw.) sollten vor der Verwendung in SQL-Abfragen geeignet escaped werden, um SQL-Injection-Schwachstellen zu beseitigen. Über diese Schwachstelle ließe sich u.a. deine komplette Datenbank löschen.

Also wird aus
$result = mysql_query("SELECT * FROM news WHERE newsid='$newsid' ",$connect);

folgendes
$newsid = mysql_real_escape_string( $_GET['newsid'], $connect );
$result = mysql_query("SELECT * FROM news WHERE newsid='$newsid' ",$connect);


Wenn newsid ein Integer-Wert ist, kannst du statt mysql_real_escape_string() auch intval() verwenden.
0 Punkte
Beantwortet von mich-2 Einsteiger_in (21 Punkte)
Hallo Supermax,

vielen Dank, es funktioniert jetzt auch wenn ich
php_flag register_globals on
aus der .htaccess-Datei rausnehme.
Aber (vorsicht,dumme Frage) ist es jetzt tatsächlich "sicherer" ?

Gruß
Mich
0 Punkte
Beantwortet von supermax Experte (4.8k Punkte)
Das größte Sicherheitsproblem bei der Verwendung von register_globals war, daß ein "Angreifer" beliebige globale Variable in deinem Code setzen konnte, indem er diese einfach an die URL angehängt bzw. per POST an dein Script geschickt hat. Als Programmierer mußte man daher stets darauf achten, alle Variablen, die im Skript verwendet wurden, vor der Verwendung zu initialisieren.

Mit der Verwendung von $_GET ( bzw. $_POST für Formulare, die mit method="POST" abgeschickt werden, $_COOKIE für Cookies und $_SESSION für Session-Daten usw.) fällt diese Schwachstelle weg.

Es gibt allerdings noch genug andere Fallstricke.

- vor der Verwendung in SQL-Queries müssen alle Eingaben entsprechend bereinigt bzw. escaped werden (oder man verwendet gleich prepared statements bzw. parametrisierte Queries).

- Soll eine Usereingabe auch wieder aus der Seite ausgegeben werden, müssen alle Zeichen mit einer speziellen Bedeutung in HTML (zumindest die Zeichen < > & und Anführungszeichen) mit htmlspecialchars() in die entsprechenden HTML-Entities (&lt ; &gt ; &amp ;) umgewandelt werden. HTML-Tags sollten ebenfalls ausgefiltert werden (strip_tags()). Im "besten" Fall wird nur das Seitenlayout zerstört, wenn der Benutzer beliebiges HTML eingeben kann, im schlimmsten Fall können über eingeschleustes JavaScript in <script>-Tags Daten ausgelesen oder manipuliert werden.
0 Punkte
Beantwortet von mich-2 Einsteiger_in (21 Punkte)
Vielen Dank nochmal, auch für die ausführliche Erklärung !

Gruß
Mich
...