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?)

War es hilfreich?

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 erreichen
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);

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

verwenden

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();

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