Frage

Also habe ich ein wenig gewürzt PHP-Entwickler bin und seit 2007 ‚das verdammte Ding doin‘ wurden; jedoch bin ich noch relativ n00bish, wenn es meine Anwendungen zu sichern, kommt. In der Art und Weise, die ich nicht wirklich alles wissen, ich weiß, ich könnte und sollte.

Ich habe nahm Absichern von PHP Web-Anwendungen und meine Art und Weise lese durch es Dinge zu testen entlang dem Weg. Ich habe einige Fragen für die SO-Gruppe allgemein, die Datenbankabfragen beziehen sich (vor allem unter mysql):

Wenn Anwendungen erstellen, die Daten in eine Datenbank gestellt wird mysql_real_escape_string und allgemeine Überprüfung (is_numeric usw.) auf Eingangsdaten genug? Was ist mit anderen Arten von Angriffen unterscheiden sich von SQL-Injection.

Könnte jemand erklären, Stored Procedures und vorbereitete Anweisungen mit etwas mehr Informationen als - Sie können sie Anrufe tätigen und zu ihnen zu machen. Ich würde gerne wissen, wie sie funktionieren, was die Validierung geht hinter den Kulissen auf.

Ich arbeite in einem php4 gebunden Umwelt und php5 ist keine Option für den Augenblick. Hat jemand anderes vor in dieser Position gewesen, was haben Sie tun, um Ihre Anwendungen zu sichern, während alle coolen Kinder, die süße neue mysqli-Schnittstelle verwenden?

Was sind einige allgemeine gute Praktiken Menschen gefunden haben, von Vorteil zu sein, die Betonung auf eine Infrastruktur, die Schaffung der Lage, Upgrades und Migrationen möglich standhalten (wie PHP4 auf PHP5 zu bewegen).

. Hinweis: eine Suche hatte um nichts ähnlich wie diese finden könnte, die die PHP-MySQL-Sicherheit getroffen

War es hilfreich?

Lösung

Meine Empfehlungen:

  1. Graben Mysqli für PDO (mit MySQL-Treiber )
  2. verwenden PDO paremeterized Prepared Statements

Sie können dann so etwas wie:

$pdo_obj = new PDO( 'mysql:server=localhost; dbname=mydatabase', 
                    $dbusername, $dbpassword );

$sql = 'SELECT column FROM table WHERE condition=:condition';
$params = array( ':condition' => 1 );

$statement = $pdo_obj->prepare( $sql, 
    array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) );
$statement->execute( $params );
$result = $statement->fetchAll( PDO::FETCH_ASSOC );

Vorteile:

  1. Keine manuelle Entkommen da PDO macht alles für Sie!
  2. Es ist relativ einfach Datenbank-Backends ganz plötzlich zu wechseln.

CONs:

  • Ich kann nicht glauben, der überhaupt.

Andere Tipps

Javier Antwort, die die owasp Link hat, ist ein guter Anfang.

Es gibt ein paar Dinge, die Sie können mehr tun:

  1. In Bezug auf SQL-Injection-Angriffe, können Sie eine Funktion schreiben, die gemeinsame SQL-Anweisungen von der Eingabe wie "DROP" entfernen wird oder "DELETE * WHERE", wie folgt:

    * $ sqlarray = array ( "DROP", "oder 1 = 1", "union select", "SELECT * FROM", "wählen host", "create table", "FROM users", "Benutzer WHERE" ); *

    Dann die Funktion schreiben, die Ihre Eingabe gegen diese Anordnung überprüfen. Achten Sie darauf, eine der Sachen in der $ sqlarray nicht gemeinsamen Eingang von Ihren Benutzern sein. (Vergessen Sie nicht strtolower auf diese dank lou zu verwenden).

  2. Ich bin mir nicht sicher, ob memcache mit PHP 4 funktioniert, aber man kann nur mit memcache in Ort, um Spam-Schutz gestellt, indem einen bestimmten Remote-IP-Zugriff auf die process.php Seite X Höhe der Zeit in Y Zeitraum erlaubt .

  3. Berechtigungen sind wichtig. Wenn Sie nur Privilegien benötigen einfügen (sagen wir, Auftragsabwicklung), dann sollten Sie die Datenbank auf dem Bestellprozess Seite mit einem Benutzer anmelden in die nur einfügen hat und vielleicht wählen Privilegien. Dies bedeutet, dass selbst wenn eine SQL-Injection-durchkam, konnten sie nur INSERT / SELECT-Abfragen ausführen und nicht löschen oder Umstrukturierung.

  4. Setzen Sie wichtige PHP-Verarbeitung von Dateien in einem Verzeichnis wie / umfassen. Dann alle Zugang IPs nicht zuzulassen, dass / include.

  5. Setzen Sie ein gesalzen MD5 mit dem Agenten des Benutzers + remoteip + Ihr Salz in der Sitzung des Benutzers, und es auf jeder Seite zu laden, machen überprüfen, ob die korrekten MD5 in ihrem Cookie ist.

  6. Verbieten bestimmte Header ( http://www.owasp.org/index.php / Testing_for_HTTP_Methods_and_XST ). Verbieten PUT (Wenn Sie das Hochladen von Dateien nicht benötigen) / TRACE / CONNECT / DELETE-Header.

ich in der Regel nicht mit PHP arbeiten, so kann ich Rat nicht speziell auf Ihre Anforderungen gezielt liefern, aber ich schlage vor, dass Sie einen Blick auf die OWASP Seite nehmen, vor allem die Top-10-Sicherheitslücken berichten: http://www.owasp.org/index.php/Top_10_2007

In dieser Seite für jede Schwachstelle erhalten Sie eine Liste der Dinge, die Sie tun können, um das Problem in verschiedenen Plattformen zu vermeiden (.NET, Java, PHP, etc.)

die vorbereiteten Aussagen in Bezug auf, sie arbeiten der Datenbank-Engine kennen, indem man, wie viele Parameter und welche Arten während einer bestimmten Abfrage, mit diesen Daten kann den Motor zu erwarten verstehen, welche Zeichen Teil des eigentlichen Parameters ist und nicht etwas, das sollte geparste SQL als wie eine Be '(Apostroph) als Teil der Daten anstelle eines als String-Begrenzer. Leider kann ich nicht mehr Informationen zur Verfügung stellen zu PHP gezielt, aber hoffe, das hilft.

AFAIK, PHP / mySQL nicht haben in der Regel parametrisierte Abfragen.

Mit sprintf() mit mysql_real_escape_string() sollte ziemlich gut funktionieren. Wenn Sie Strings entsprechende Format verwenden für sprintf() (beispielsweise „% d“ für ganze Zahlen) sollten Sie ziemlich sicher sein.

kann ich falsch sein, aber es sollte nicht genug sein, verwenden mysql_real_escape_string auf Benutzerdaten zur Verfügung gestellt?

, es sei denn, wenn sie Zahlen sind, in diesem Fall sind Sie sicher, dass sie in der Tat Zahlen statt durch die Verwendung beispielsweise sind machen sollten ctype_digit oder is_numeric oder sprintf (mit %d oder %u zu zwingen Eingabe in eine Zahl).

Auch für Ihren PHP-Skripte einen serarate MySQL-Benutzer hat, die nur SELECT kann, INSERT, UPDATE und DELETE ist wahrscheinlich eine gute Idee ...


Beispiel von php.net

  

Beispiel # 3 Eine "Best Practice" Abfrage

     

Mit mysql_real_escape_string () um jede Variable verhindert, dass SQL-Injection. Dieses Beispiel zeigt die „best practice“ -Methode für die Abfrage einer Datenbank, unabhängig von der Magic Quotes einstellen.

     

Die Abfrage wird nun korrekt ausführen und SQL-Injection-Angriffe werden nicht funktionieren.

   <?php
    if (isset($_POST['product_name']) && isset($_POST['product_description']) && isset($_POST['user_id'])) {
        // Connect

        $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password');

        if(!is_resource($link)) {

            echo "Failed to connect to the server\n";
            // ... log the error properly

        } else {

            // Reverse magic_quotes_gpc/magic_quotes_sybase effects on those vars if ON.

            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'];
            }

            // Make a safe query
            $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 "Product inserted\n";
            }
        }
    } else {
        echo "Fill the form properly\n";
    }

Verwendung von gespeicherten Prozeduren für jede Aktivität, die auf die DB beinhaltet Schreiben und bind Parameter für alle wählen verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top