Die ultimative Clean/Secure-Funktion

Lesezeit: 7 Minuten

Die ultimative CleanSecure Funktion
Karem

Ich habe viele Benutzereingaben von $_GET und $_POST… Im Moment schreibe ich immer mysql_real_escape_string($_GET['var'])..

Ich würde gerne wissen, ob Sie eine Funktion machen könnten, die das sichert, entkommt und reinigt $_GET/$_POST Arrays sofort, sodass Sie sich nicht jedes Mal damit befassen müssen, wenn Sie mit Benutzereingaben und dergleichen arbeiten.

Ich dachte an eine Funktion, z cleanMe($input)und darin sollte es tun mysql_real_escape_string, htmlspecialchars, strip_tags, stripslashes (Ich denke, das wäre alles, um es sauber und sicher zu machen) und dann das zurückzugeben $input.

Also ist das möglich? Erstellen einer Funktion, die für alle funktioniert $_GET und $_POSTalso würden Sie nur dies tun:

$_GET  = cleanMe($_GET);
$_POST = cleanMe($_POST);

Also in deinem Code später, wenn du mit zB arbeitest $_GET['blabla'] oder $_POST['haha'] sie werden gesichert, abisoliert und so weiter?

Habe mich ein wenig versucht:

function cleanMe($input) {
   $input = mysql_real_escape_string($input);
   $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
   $input = strip_tags($input);
   $input = stripslashes($input);
   return $input;
}

  • stripslashes() nach dem mysql_real_escape_string() … meine Augen!

    – jensgram

    19. November 2010 um 10:15 Uhr

  • Ich denke, die Datensicherheit hängt davon ab, was sie tun und woher sie kommen. Nicht alle Ihre Behandlungen sind notwendigerweise erforderlich.

    – MatTheCat

    19. November 2010 um 10:15 Uhr

  • Die Verwendung einer einmaligen Master-Bereinigungsfunktion ist nicht die richtige Lösung. Deshalb magische zitate gescheitert. Entkommen (oder bessere Lösungen wie vorbereitete Anweisungen verwenden) Falls und wann du brauchst es. Andernfalls werden Sie feststellen, dass Sie zur falschen Zeit und oft mehr als einmal entkommen. Alle diese Funktionen haben sehr unterschiedliche Zwecke, und mehrere (z mysql_real_escape_string und stripslashes) sind im Wesentlichen invers. Sehen [What’s the best method for sanitizing user input with PHP? ](stackoverflow.com/questions/129677) für weitere Informationen.

    – Matthäus Flaschen

    19. November 2010 um 10:16 Uhr


  • Oah wow, cleanMe() stoppt nicht alle xss und unternimmt nichts, um sqli zu stoppen stripslashes(). Dieser Code ist schmerzhaft.

    – Turm

    23. November 2010 um 18:48 Uhr


  • mögliches Duplikat von Was sind die besten PHP-Eingabebereinigungsfunktionen?

    – T. Todua

    25. September 2014 um 11:51 Uhr

Die ultimative CleanSecure Funktion
Pekka

Die Idee einer generischen Sanitärfunktion ist ein kaputtes Konzept.

Es gibt ein für jeden Zweck die richtige Sanierungsmethode. Wenn Sie sie alle wahllos auf einer Zeichenfolge ausführen, wird diese häufig beschädigt. Wenn Sie ein Stück HTML-Code für eine SQL-Abfrage maskieren, wird es für die Verwendung auf einer Webseite beschädigt und umgekehrt. Hygiene sollte angewendet werden kurz bevor Verwendung der Daten:

  • bevor Sie eine Datenbankabfrage ausführen. Die richtige Bereinigungsmethode hängt von der verwendeten Bibliothek ab; Sie sind in Wie kann ich SQL-Injection in PHP verhindern aufgeführt?

  • htmlspecialchars() für sichere HTML-Ausgabe

  • preg_quote() zur Verwendung in einem regulären Ausdruck

  • escapeshellarg() / escapeshellcmd() zur Verwendung in einem externen Befehl

  • usw. usw.

Die Verwendung einer „Einheitsgröße“-Hygienefunktion ist wie die Verwendung von fünf Arten hochgiftiger Insektizide auf einer Pflanze, die per Definition nur eine Art von Käfern enthalten kann – nur um herauszufinden, dass Ihre Pflanzen von einer sechsten Art befallen sind, auf der keine vorhanden ist der Insektizidarbeit.

Verwenden Sie immer diese eine richtige Methode, idealerweise direkt bevor Sie die Daten an die Funktion übergeben. noch nie Mischen Sie Methoden, es sei denn, Sie müssen.

  • Wir haben mit magic_quotes eine „automatisierte Sanierung“ durchlaufen. Nie wieder.

    – Mchl

    19. November 2010 um 10:15 Uhr

  • @Mchl +1 Das ist wohl die Nummer eins Grund für Unsicherheit in PHP-Lösungen. Es förderte im Grunde die Ignoranz der Programmierer 🙂

    – jensgram

    19. November 2010 um 10:17 Uhr

  • Ich würde hinzufügen, dass es sehr erwägenswert ist, stattdessen vorbereitete Anweisungen (PDO oder mysqli) für Datenbankabfragen zu verwenden.

    – Matthäus Flaschen

    19. November 2010 um 10:20 Uhr


  • +1 Sie treffen den Nagel auf den Kopf, eine Schwachstelle hängt vollständig davon ab, wie die Daten verwendet werden.

    – Turm

    23. November 2010 um 18:46 Uhr


  • @Toby Wenn Sie es für angebracht halten, eine gültige (und übrigens akzeptierte) Antwort abzulehnen, weil Ihnen die Wortwahl nicht gefällt, dann ist das natürlich Ihr Vorrecht. Aber ich persönlich finde es doof.

    – Pekka

    15. Dezember 2010 um 15:10 Uhr


1646951648 539 Die ultimative CleanSecure Funktion
Thomas

Es macht keinen Sinn, die Eingabe einfach durch all diese Funktionen zu leiten. All diese Funktionen haben unterschiedliche Bedeutungen. Daten werden nicht “sauberer”, indem mehr Escape-Funktionen aufgerufen werden.

Wenn Sie Benutzereingaben in MySQL speichern möchten, müssen Sie nur verwenden mysql_real_escape_string. Es wird dann vollständig maskiert, um es sicher in der Datenbank zu speichern.

BEARBEITEN

Beachten Sie auch die Probleme, die bei der Verwendung der anderen Funktionen auftreten. Wenn der Client beispielsweise einen Benutzernamen an den Server sendet und der Benutzername ein kaufmännisches Und (&), möchten Sie nicht angerufen haben htmlentities vor dem Speichern in der Datenbank, da dann der Benutzername in der Datenbank enthalten sein wird &.

Du schaust nach filter_input_array(). Ich schlage jedoch vor, dies nur für die Validierung/Bereinigung im Geschäftsstil und nicht für die SQL-Eingabefilterung zu verwenden.

Verwenden Sie zum Schutz vor SQL-Injection parametrisierte Abfragen mit mysql oder PDO.

Das Problem ist, dass etwas Sauberes oder Sicheres für eine Verwendung nicht für eine andere Verwendung gilt: Bereinigung für einen Teil eines Pfads, für einen Teil einer MySQL-Abfrage, für die HTML-Ausgabe (als HTML oder in Javascript oder im Wert einer Eingabe). für XML können verschiedene Dinge erforderlich sein, die widersprechen.

Aber einige globale Dinge können getan werden. Versuchen zu benutzen filter_eingabe um die Eingabe Ihres Benutzers zu erhalten. Und verwenden vorbereitete Erklärungen für Ihre SQL-Abfragen.

Anstelle einer Alleskönner-Funktion können Sie jedoch eine Klasse erstellen, die Ihre Eingaben verwaltet. Sowas in der Art :

class inputManager{
  static function toHTML($field){
    $data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS);
    return $data;
  }
  static function toSQL($field, $dbType="mysql"){
    $data = filter_input(INPUT_GET, $field);
    if($dbType == 'mysql'){
      return mysql_real_escape_string($data);
    }
  }
}

Wenn Sie bei solchen Dingen $_POST, $GET, $_REQUEST oder $_COOKIE in Ihrem Code sehen, wissen Sie, dass Sie ihn ändern müssen. Und wenn Sie eines Tages ändern müssen, wie Sie Ihre Eingaben filtern, ändern Sie einfach die Klasse, die Sie erstellt haben.

Die ultimative CleanSecure Funktion
Filipe YaBa Polido

Darf ich vorschlagen, “mod_security” zu installieren, wenn Sie Apache verwenden und vollen Zugriff auf den Server haben?!
Es hat die meisten meiner Probleme gelöst. Verlassen Sie sich jedoch nicht nur auf eine oder zwei Lösungen, sondern schreiben Sie immer sicheren Code 😉

AKTUALISIEREN
Dieses PHP-IDS gefunden (http://php-ids.org/); scheint gut zu sein 🙂

  • Was hat mod_security mit Input-Escape, SQL-Injection usw. zu tun?

    – BoltClock

    19. November 2010 um 10:44 Uhr

  • @BoltClock Siehe den Abschnitt Häufig verwendete Konfigurationsregeln in Dieser Beitragoder sehen Sie sich ein anderes von Symantec an: Web Security Appliance mit Apache und mod_security.

    – István Ujj-Mészáros

    19. November 2010 um 11:13 Uhr


  • @BoltClock: Es ist wie ein Leibwächter, selbst wenn du es vermasselst, ist er da, um dir zu helfen 😉

    – Filipe YaBa Polido

    19. November 2010 um 14:40 Uhr

<?php
function sanitizeString($var)
{
    $var = stripslashes($var);
    $var = strip_tags($var);
    $var = htmlentities($var);
    return $var;
}

function sanitizeMySQL($connection, $var)
{
    $var = $connection->real_escape_string($var);
    $var = sanitizeString($var);
    return $var;
}
?>

  • Was hat mod_security mit Input-Escape, SQL-Injection usw. zu tun?

    – BoltClock

    19. November 2010 um 10:44 Uhr

  • @BoltClock Siehe den Abschnitt Häufig verwendete Konfigurationsregeln in Dieser Beitragoder sehen Sie sich ein anderes von Symantec an: Web Security Appliance mit Apache und mod_security.

    – István Ujj-Mészáros

    19. November 2010 um 11:13 Uhr


  • @BoltClock: Es ist wie ein Leibwächter, selbst wenn du es vermasselst, ist er da, um dir zu helfen 😉

    – Filipe YaBa Polido

    19. November 2010 um 14:40 Uhr

Ich habe dieses Pass-Array verwendet oder get , post

function cleanme(&$array)
{ 
 if (isset($array))
 {
     foreach ($array as $key => $value)
     {
          if (is_array($array[$key]))
          {
           secure_array($array[$key]);
          }
          else 
          {
            $array[$key] = strip_tags(mysql_real_escape_string(trim($array[$key])));
          }
     }
 }
}

Verwendungszweck :

cleanme($_GET);   
cleanme($_POST);

  • Was wird der Rückgabetyp davon sein

    – Shailender Ahuja

    21. Juli 2017 um 8:45 Uhr

  • Das Array wird als Referenz übergeben, sodass es direkt geändert wird, keine Datenrückgabe, die Antwort aktualisiert wird.

    – Benutzer889030

    21. Juli 2017 um 16:46 Uhr

989170cookie-checkDie ultimative Clean/Secure-Funktion

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy