2012-03-26 6 views
1

In einem Funktionsaufruf wie diese die sichere Funktion der SQL-InjectionWann weiß mysql_real_escape_string, welcher DB-Server momentan zuständig ist?

$rs = getrs($dbh,"select firstname,lastname from users where userid='" . safe($uid) . "'") 

würde richtig behandeln?

Die sichere Funktion macht im Prinzip nichts anderes, als mysql_real_escape_string auf das übergebene Argument anzuwenden, was in diesem Fall $ uid ist.

Wenn ja, sehe ich nicht wie.

Ich sehe nicht, wie das funktionieren würde, weil das Datenbankhandle $dbh und die Funktion safe() in verschiedenen Kontexten ausgeführt werden.

Gibt es eine Möglichkeit, eine praktische Funktion wie den obigen Liner zu schreiben, während sichergestellt wird, dass alle Variablen, die in einer sicheren Funktion eingeschlossen sind, ordnungsgemäß ausgeblendet werden.

und gibt es auch eine Funktion in PHP, die Sie übergeben die 4dbh und es sagt Ihnen, ob es ein MySQL oder Mssql Handle ist?

+0

[mysql_real_escape_string] (http://php.net/manual/en/function.mysql-real-escape-string.php) mit einem zweiten (optional) Parameter übernimmt - die Verbindungskennung. Sie sollten das Handle einer offenen Verbindung explizit an diese Funktion übergeben. –

Antwort

1

Wann wissen mysql_real_escape_string Server die db verantwortlich ist im Moment?

Vom manual:

Wird die Verbindungskennung nicht angegeben ist, das letzte Glied von mysql_connect() geöffnet wurde angenommen. Wenn keine solche Verbindung gefunden wird, wird versucht, zu erstellen, als ob mysql_connect() ohne Argumente aufgerufen würde. Wenn keine Verbindung gefunden oder eingerichtet wurde, wird ein E_WARNING-Ebenenfehler generiert.

[...]

würde die sichere Funktion richtig die SQL-Injektion behandeln?

In Ihrem speziellen Fall würde es ja.

Gibt es eine Möglichkeit, eine praktische Funktion wie die oben einzeiler zu schreiben, während dafür, dass alle Variablen, die in einem sicheren wie Funktion eingewickelt werden, sind richtig entkommen.

Einige Leute verwenden gerne sprintf dafür. Der richtige Weg, dies zu tun, ist jedoch parametrisierte Abfragen (PDO).

und auch gibt es eine Funktion in PHP, dass Sie die 4dbh passieren und es sagt Ihnen, ob es sich um eine MySQL oder MSSQL umgehen?

Sie get_resource_type verwenden könnte

$dbh = mysql_connect(); 
echo get_resource_type($dbh); // mysql link 
+0

Vielen Dank für alles. Ich würde gerne PDO verwenden, aber ich konnte es nicht auf einen Einzeiler bringen, wie es die Funktion der GETRs ist. Gibt es eine PDO-Bibliothek, die viele Ein- oder Zwei-Liner hat, um sicher auszuwählen, zu aktualisieren und einzufügen? –

+0

@John Ihre Gers Funktion ist kein echter One-Liner. Wie unterscheidet es sich von nur einem mysql_query Aufruf? –

0

Für SQL richtig entkommen zu sein, verwenden http://php.net/manual/en/pdo.prepared-statements.php

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 
+0

Juan, warum ist PDO besser als mysql_real_escape_string?Ich frage dies im Rahmen von Ich arbeite nie mit Multi-Byte-Zeichen und ich bleibe immer - immer bei UTF-8. Warum sollte ich zu PDO wechseln? –

+0

@JohnSmith Wenn Sie einen anderen Treiber verwenden (nicht mysql), wird der richtige Escapemechanismus für diesen Treiber verwendet. –

+0

OK. Aber wenn ich nicht in "andere Treiber als mysql" und "andere Charsets als utf-8" einsteigen will, bin ich mit mysql im Gegensatz zu PDO nicht besser dran. Soweit sql injection, sind sie identisch und so weit wie die Leistung geht, denke ich, dass mysql PDO bei der Ausführung bestimmter Aussagen schlagen wird, weil PDO eine roud Reise in vorbereiteten Aussagen macht. –

0

Abgesehen von der dumme Frage, die durch das Lesen der Handbuchseite nur beantwortet werden können, gibt es viel wichtigeres Problem angegeben:

würde die safe Funktioniert richtig mit der SQL-Injektion?

Nr

Solange safe() Funktion im Grunde tut nichts anderes als das mysql_real_escape_string über das übergebene Argument anwenden, sollte es nicht so genannt werden. Weil die Anwendung von mysql_real_escape_string nichts mit Injektionen oder Sicherheit zu tun hat.

Zumindest diese Funktion muss hinzufügen um übergebenen Wert zusätzlich zu entkommen. Es wird einige Abfragen fehlerhaft aber zumindest sicher machen.

Gibt es eine Möglichkeit, eine praktische Funktion wie den obigen Liner zu schreiben, während sichergestellt wird, dass alle Variablen, die in eine sichere Funktion eingeschlossen sind, ordnungsgemäß ausgeblendet werden.

Sicher.
Platzhalter verwenden.

$rs = getrs($dbh,"select firstname,lastname from users where userid=?",$uid); 

Ein benutzerdefinierter Handler den Platzhalter ? mit sicher vorbereitet Wert ersetzen.

Hier ist eine Funktion, die ich schon vor langer Zeit mit der gleichen Absicht als „oneliner“ aber mehr vernünftig, sowohl Sicherheit und Benutzerfreundlichkeit im Verstand geschrieben.
Es sicherlich nicht ideal - keine % Zeichen haben direkt in der Abfrage gestellt werden, wie es printf Syntax ist verwenden. Und es hat keinen Platzhalter für die Bezeichner (sowie viele andere praktische Platzhalter). Und natürlich wäre eine OOP-Implementierung viel flexibler, da sie statt einer hässlichen "Modus" -Variable saubere, eindeutige Methoden hat.
Aber wenn Sie eine Funktion wünschen

function dbget() { 
    /* 
    usage: dbget($mode, $query, $param1, $param2,...); 
    $mode - "dimension" of result: 
    0 - resource 
    1 - scalar 
    2 - row 
    3 - array of rows 
    */ 
    $args = func_get_args(); 
    if (count($args) < 2) { 
    trigger_error("dbget: too few arguments"); 
    return false; 
    } 
    $mode = array_shift($args); 
    $query = array_shift($args); 
    $query = str_replace("%s","'%s'",$query); 

    foreach ($args as $key => $val) { 
    $args[$key] = mysql_real_escape_string($val); 
    } 

    $query = vsprintf($query, $args); 
    if (!$query) return false; 

    $res = mysql_query($query); 
    if (!$res) { 
    trigger_error("dbget: ".mysql_error()." in ".$query); 
    return false; 
    } 

    if ($mode === 0) return $res; 

    if ($mode === 1) { 
    if ($row = mysql_fetch_row($res)) return $row[0]; 
    else return NULL; 
    } 

    $a = array(); 
    if ($mode === 2) { 
    if ($row = mysql_fetch_assoc($res)) return $row; 
    } 
    if ($mode === 3) { 
    while($row = mysql_fetch_assoc($res)) $a[]=$row; 
    } 
    return $a; 
} 
?> 

Sie können Ihre $ dbh hinzufügen, um es Anruf, aber ich sehe keinen Sinn darin.

gibt es eine Funktion in PHP, dass Sie die $ dbh passieren und es sagt Ihnen, ob es sich um eine MySQL oder MSSQL

Es gibt absolut keinen Punkt behandeln solche Funktion zu haben. Wenn man einen Datenbank-Handler benutzen muss, muss er offensichtlich wissen, zu welchem ​​Datenbank-Treiber er gehört.
Oh. Und ich hoffe, dass Sie mysql_real_escape_string mit ms sql nicht verwenden werden.

+0

würde die sichere Funktion richtig mit der SQL-Injektion umgehen? Nr. Solange die Funktion safe() grundsätzlich nichts anderes tut, als mysql_real_escape_string auf das übergebene Argument anzuwenden, sollte es nicht so benannt werden. Weil die Anwendung von mysql_real_escape_string nichts mit Injektionen oder Sicherheit zu tun hat. -- Sehr gut! –

Verwandte Themen