mysql_real_escape_string () für ganze $ _REQUEST Array oder Bedarf durch sie Schleife?
-
26-09-2019 - |
Frage
Gibt es einen einfacheren Weg, der sicher gestellt andere Variablen als die folgende Extraktion?
if(isset($_REQUEST['kkld'])) $kkld=mysql_real_escape_string($_REQUEST['kkld']);
if(isset($_REQUEST['info'])) $info=mysql_real_escape_string($_REQUEST['info']);
if(isset($_REQUEST['freq'])) $freq=mysql_real_escape_string($_REQUEST['freq']);
(Und: Sie verwenden würden isset()
in diesem Zusammenhang?)
Lösung
Um alle Variablen in einem Rutsch zu entkommen:
$escapedGet = array_map('mysql_real_escape_string', $_GET);
Auszug alle Variablen in den aktuellen Namensraum (das heißt $foo = $_GET['foo']
):
extract($escapedGet);
Bitte verwenden Sie diesen letzten Schritt nicht tun, wenn. Es gibt keine Notwendigkeit zu, nur die Werte in einem Array zu lassen. Extrahieren von Variablen zu Namenskollisionen und Überschreiben von vorhandenen Variablen führen kann, die nicht nur ein Streit und eine Quelle von Fehlern, sondern auch ein Sicherheitsrisiko. Auch, wie @BoltClock sagt, bleib bei $_GET
oder $_POST
. Also2, wie @zerkms Punkte aus, gibt es keinen Punkt in mysql_real_escaping
Variablen, die angeblich nicht in einer Datenbankabfrage verwendet werden soll, kann es sogar zu weiteren Problemen führen.
Beachten Sie, dass wirklich keine Dies ist eine besonders gute Idee überhaupt, du bist nur magic_quotes und global_vars reinkarnierenden, die Vergangenheit schreckliche PHP Praktiken im Alter waren. Verwenden Sie vorbereitete Anweisungen mit gebundenen Parametern über mysqli oder PDO und Nutzungswert durch $_GET
oder filter_input
. Siehe http://www.phptherightway.com .
Andere Tipps
Sie können auch eine rekursive Funktion wie folgt verwenden, dass
zu erreichenfunction sanitate($array) {
foreach($array as $key=>$value) {
if(is_array($value)) { sanitate($value); }
else { $array[$key] = mysql_real_escape_string($value); }
}
return $array;
}
sanitate($_POST);
Soweit ich betroffen bin Starx‘und Ryans Antwort vom 19. November '10 ist die beste Lösung hier, wie ich dies nur erforderlich, auch.
Wenn Sie mehrere Eingabefelder mit einem Namen (zB Namen []), was bedeutet, werden sie in ein Array innerhalb des $ _POST-Array gespeichert werden, haben Sie eine rekursive Funktion zu verwenden, wie mysql_real_escape_string funktioniert nicht für Arrays.
Das ist also die einzige Lösung, ein $ _POST Variable zu entkommen.
function sanitate($array) {
foreach($array as $key=>$value) {
if(is_array($value)) { sanitate($value); }
else { $array[$key] = mysql_real_escape_string($value); }
}
return $array;
}
sanitate($_POST);
sanieren oder validieren jeden INPUT_GET
, INPUT_POST
, INPUT_COOKIE
, INPUT_SERVER
oder INPUT_ENV
, können Sie
-
filter_input_array
- Ruft externe Variablen und filtert optional sie
Die Filterung kann mit einem Rückruf erfolgen, so dass Sie mysql_real_escape_string
liefern könnten.
Diese Methode ist nicht erlaubt Filterung für $_REQUEST
, weil Sie sollten nicht die Arbeit mit $_REQUEST
, wenn die Daten in einem der anderen Superglobals zur Verfügung steht. Es ist möglicherweise unsicher.
Das Verfahren erfordert, dass Sie auch die Eingabetaste zu nennen, so dass es keine Filterung eine generische Batch ist. Wenn Sie generische Batch-Filterung wollen, verwenden Sie array_map
oder array_walk
oder array_filter
wie an anderer Stelle auf dieser Seite gezeigt.
Auch, warum verwenden Sie die alte MySQL-Erweiterung statt der mysqli (i für eine verbesserte) Verlängerung. Die mysqli-Erweiterung geben Ihnen Unterstützung für Transaktionen , Multiqueries und
Wenn Sie mysqli Erweiterung und Sie alle GET-Variablen entkommen: $escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);
Als Alternative kann ich Ihnen raten, zu verwenden PHP7 Eingangsfilter , die bietet eine Verknüpfung zu sQL entkommen. Ich würde es nicht empfehlen, per se, aber es Ersatzteile zu schaffen lokalisierten Variablen:
$_REQUEST->sql['kkld']
Welche inline in SQL Query-Strings verwendet werden kann, und gibt eine zusätzliche Warnung sollten Sie es vergessen:
mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");
Es ist syntaktisch fragwürdig, sondern ermöglicht es Ihnen, nur die Variablen zu entkommen, die es wirklich brauchen. Oder zu emulieren, was Sie gefragt, Verwendung $_REQUEST->sql->always();