Skripte absichern / POST

Skripte absichern / POST

am 20.10.2006 16:33:25 von michael.fan

Hallo NG,

ich habe mittlerweile einige Anleitungen und Foren durchforstet und
möchte mich an dieser Stelle bei Euch doch fachlich sehr kompetenten
Newsgroup-Member absichern.

Also, ich bin PHP-Anfänger und habe einige Skripte, die ich demnächst
ins Netz Stellen möchte.
Mit

schicke ich Variablen an
eine andere PHP Seite.

Auf den verschiedenen Seiten werden die Variablen z.T. in MySQL
Abfragen und auch MySQL Inserts verwendet.
Nun habe ich einiges über SQL-Injections gelesen und möchte mich
gegen Missbrauch absichern.

Folgendes möchte ich gerne auf den Seiten implementieren um mich
(hoffentlich) abzusichern:

Vorweg:bisher habe ich eine variable $test durch
$test =3D $HTTP_POST_VARS['test'];
definiert, da bei meinem Webprovider die RegisterGlobals auf off ist.

Das möchte ich zur Sicherheit ersetzen durch:
$test =3D mysql_real_escape_string( $HTTP_POST_VARS['test'] );

Wenn im weiteren Verlauf des Skriptes eine Abfrage oder ein Insert
kommt möchte ich den Query qie folgt definieren:
$query =3D sprintf("SELECT name from table where test =3D '%s' ", $test);
mysql_query($query) or die("Eingabe fehlgeschlagen");

Gehe ich recht in der Annahme, dass ich - wenn ich eine Variable am
Anfang eines Skriptes definiere z.B. mit
$test =3D mysql_real_escape_string( $HTTP_POST_VARS['test'] );
- diese Variable anschließen nicht mehr geändert werden kann und für
dieses Seite als sicher gelten kann?
Dann müsste man am Anfang eines Skriptes z.B. mit
mysql_real_escape_string die Variablen, die übergeben worden sind
"sicher machen" und kann anschließend diese in MySQL abfragen ohne
Bedenken nutzen, oder?


Ich freue mich auf Euer Feedback!
Vielen Dank schon mal.
Gruß
Micha

Re: Skripte absichern / POST

am 20.10.2006 18:45:06 von Ulf Kadner

michael.fan@lycos.de schrieb:
^ Änder das mal bitte in Deine Namen!

> Mit schicke ich Variablen an
> eine andere PHP Seite.

Du schickst damit nur Daten. ;-)

> Nun habe ich einiges über SQL-Injections gelesen und möchte mich
> gegen Missbrauch absichern.

Das ist schon mal lobenswert.

> Folgendes möchte ich gerne auf den Seiten implementieren um mich
> (hoffentlich) abzusichern:
>
> Vorweg:bisher habe ich eine variable $test durch
> $test = $HTTP_POST_VARS['test'];
> definiert, da bei meinem Webprovider die RegisterGlobals auf off ist.
>
> Das möchte ich zur Sicherheit ersetzen durch:
> $test = mysql_real_escape_string( $HTTP_POST_VARS['test'] );

Zuerst: $das was Du nutzen willst steht in $_POST und ist superglobal
(will heißen überall verfügbar) $HTTP_POST_VARS ist veraltet und hat
ausserdem nicht dern superglobalen Vorteil. Ausserdem fallt diese in
absehbarer Zukunft komplet weg.

Du solltest an mysql_real_escape_string() immer die aktuell zu nutzende
Mysql-Resource (wird z.B.: mit mysql_connect() erstellt) mit als
Parameter angeben. Verhindert Fehler die durch Unaufmerksamkeit entstehen.

> Wenn im weiteren Verlauf des Skriptes eine Abfrage oder ein Insert
> kommt möchte ich den Query qie folgt definieren:
> $query = sprintf("SELECT name from table where test = '%s' ", $test);

Die Zeile macht so keinen Sinn!
$query = "SELECT name from table where test = '{$test}' ";

Ist besser lesbar und hat keine wirklichen Nachteile. Das wird erst für
sprint_f interessant wenn mehr passiert (Verkettungen, parsen)

> mysql_query($query) or die("Eingabe fehlgeschlagen");

> Gehe ich recht in der Annahme, dass ich - wenn ich eine Variable am
> Anfang eines Skriptes definiere z.B. mit
> $test = mysql_real_escape_string( $HTTP_POST_VARS['test'] );
> - diese Variable anschließen nicht mehr geändert werden kann und für
> dieses Seite als sicher gelten kann?

Die kann an jeder stelle in Deinem Code verändert werden. Nur von Aussen
nicht, aber das sollte klar sein.

MfG, Ulf

Re: Skripte absichern / POST

am 20.10.2006 23:23:10 von Martin Lemke

michael.fan@lycos.de schrieb:

> Nun habe ich einiges über SQL-Injections gelesen und möchte mich
> gegen Missbrauch absichern.

Ich setze seit einiger Zeit die Klasse ZendDB (Zend-Framework) ein [1].
Dort gibt es verschiedene Möglichkeiten sich gegen SQL-Injection
abzusichern.

Im Prinzip müsste es damifolgendermaßen laufen (Beispiel):

$sql=$db->quoteInto('SELECT * FROM mytab WHERE name=?',$_POST['name']);

Ein evewntuell nötiges Quoting wird automatisch durchgeführt.

$db->fetchOne($sql);

u.s.w.

Zum Zend-Framework gibt es unter anderem ein Manual auf Deutsch. Ob Das
Framework hinsichtlich Deiner Konstellation in einer fehlerfreien Version
verfügbar ist, musst Du allerdings erstmal eruieren.

Für mich MySQL 5/PHP 5.* +PDO ist die Konstellation stimmig.

Martin

[1] http://framework.zend.com/ (kostenlos)

Re: Skripte absichern / POST

am 21.10.2006 20:24:08 von michael.fan

Hallo,

vielen Dank schon mal für Eure Antworten.

ich habe nochmal eine weitere Frage:
Ich habe auf einer Seite ein Script, auf dem ich mit Post und action=3D""
sozusagen immer auf die gleiche bestehende Seite poste.So:

if(isset($_POST['aktion1'])){
tue das;
}elseif (isset($_POST['aktion2'])){
tue dies
}elseif (isset($_POST['aktion3'])){
mach jenes;
}else{
bla;
}

Gibt es eine Möglichkeit neben dem Referrer, in den einzelnen
"Aktionsbereichen" eine Sicherheitsabfrage zu definieren, die nur die
POSTS von dieser Seite erlaubt?

Ist mein Anliegen klar geworden?

Danke schon mal
Micha

Re: Skripte absichern / POST

am 21.10.2006 21:43:51 von Martin Lemke

michael.fan@lycos.de schrieb:

> Ist mein Anliegen klar geworden?

Wenn Du eine neue Frage hast, die mit der alten nichts zu tun hat, solltest
Du darüer einen neuen Thread eröffnen.

Martin