Gegenmaßnahmen sql injection

thehasso

Erfahrenes Mitglied
Servus jungs,

Meine Website ist eine etwas sehr unsicher Programmierte Website. Die sich cirka bei 60 PHP Dateien beläuft. Jetzt wollt ich meine Website soweit ich kann sicher machen. Sprich ich wollte in allen Dateien dieses Schema durchgehen welches ihr hier sieht:


PHP:
if( get_magic_quotes_gpc() ) {
	
 $strNachname =$_POST['strNachname'];

} 

    $SQL = sprintf("SELECT strVorname, strNachname, dateiname, intID FROM tblbenutzer WHERE strNachname='%s'",mysql_real_escape_string($strNachname));


Zurzeit sehen alle Dateien etwa so aus:
PHP:
 $strNachname =$_POST['strNachname'];

    $SQL = sprintf("SELECT strVorname, strNachname, dateiname, intID FROM tblbenutzer WHERE strNachname='%s'",$strNachname);


Könnt ihr vielleicht sagen, ob dieses Schema so voll kommen okay bzw. andere Anregungen.

Freu mich über jede hilfe.

Danke
 
Hey,

Könntest du das an meinen Beispiel, mal verdeutlichen? Versteh nicht so ganz, hab doch die POST auch escapt oder, wie meinste das?


gruß
 
Hiho,

du solltest erstmal überprüfen wenn es ein pflichtfeld ist ob es einen Wert besitzt, gegebenfalls wenn der wert nur eine Zahl sein darf auch zu überprüfen ob es nur eine zahl ist mit

PHP:
is_numeric($var)

Dann solltest du gegebenfalls HTML Zeichen kicken oder neutralisieren - oder wenn du einige zulassen willst diese überprüfen und die weiteren kicken.

neutralisieren
PHP:
htmlspecialchars()

entfernen
PHP:
strip_tags($var)

bestimmte zulassen
PHP:
strip_tags($var, $erlaubte_tags)

dann solltest du Zeichenketten escapen so das aus einem ' das wird \' .
Das kannst du mit

PHP:
mysql_escape_string($var)
oder
PHP:
mysql_real_escape_string($var)

und um gegebenfall die eingabe von nur leerzeichen zu unterbinden benutzt du

PHP:
trim($var)

und um das ganze mit einen Beispiel zu versehen, könnte es so aussehen.

PHP:
<?php

	// Zahlen
	if( isset($_POST['jahr']) && is_numeric($_POST['jahr']) ) {
		// mysql Anweisung
	}
	
	// Zeichenketten
	if( isset($_POST['name']) ) {
		$name = htmlspecialchars(mysql_escape_string(trim($_POST['name'])));
		if( !empty($name) ) {
			// mysql Anweisung
		}
	}

?>

und dann würde ich in deiner Datenbank wenn da reine TEXT felder vorhanden, die keine Begrenzung haben vorher die länge mit PHP überprüfen zum Beispiel die Zeichenkette überprüfen ob sie nicht länger als 3000 Zeichen ist. Dashat den Grund wenn einer eine Textdatei von 4 MB im Textfeld postet hat deine datenbank einwenig zutun und einige Browser werden abkacken und der Traffic wird enorm steigern.

So mehr fehlt mir gerade nicht ein.
 
Hallo zusammen!

Danke für eure hilfreichen angaben. Ich hab alle SQL abfragen mit der funktion ... versehen.


Auf PHP Manual ist folgendes Beispiel noch zu sehen:
Dazu wollt ich jetzt nun, alle $_POST mit der IF Abfrage des get_magic_quotes_gpc() versehen.

Ich versteh leider nicht so ganz wie das im Hintergrund so abläuft. Hab im Internet diese Erklärung gefunden:


Also mit get_magic_quotes_gpc überprüfst du ob beim Provider magic_quotes auf on gestellt ist. Wenn ja dann nutzt du stripslashes um die durch magic_quotes gesetzten escapes zu entfernen und dann nimmt man mysql_real_escape_string und setzt die escaps wieder.

das macht man weil mysql_real_escape_string mehr Sachen escaped als magic_quotes und sicherer ist!


Sprich, könnte jemand so lieb sein und mir das anhand ein beispiel zeigen, was wann wo passiert.

Beispielsweise ich gib in einen Eingabefeld \ ein.


Was macht magic_quotes
Was macht stripslashes
Was macht mysql_real_escape_string


PHP:
<?php

if (isset($_POST['product_name'])
    && isset($_POST['product_description'])
    && isset($_POST['user_id'])) {

 // Verbinden mit der Datenbank
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')

    if(!is_resource($link)) {

        echo "Verbindung zum Server fehlgeschlagen\n";
     // ... den Fehler loggen

    } else {

     // Die Auswirkungen von magic_quotes_gpc/magic_quotes_sybase zurücksetzen,
     // sofern die Option auf ON gesetzt ist

        if(get_magic_quotes_gpc()) {
            $product_name        = stripslashes($_POST['product_name']);
            $product_description = stripslashes($_POST['product_description']);
        } else {
            $product_name        = $_POST['product_name'];
            $product_description = $_POST['product_description'];
        }

     // einen sicheren Query zusammenstellen
        $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)",
                    mysql_real_escape_string($product_name, $link),
                    mysql_real_escape_string($product_description, $link),
                    $_POST['user_id']);

        mysql_query($query, $link);

        if (mysql_affected_rows($link) > 0) {
            echo "Produkt eingefuegt\n";
        }
    }
} else {
    echo "Fuellen Sie das Formular korrekt aus.\n";
}
?>

Danke.
gruß thehasso
 
Zurück