Frage

Unter bestimmten Mehrbyte-Zeichensätze, bin ich in der Annahme richtig, dass die folgenden nicht, was tut es beabsichtigt war, zu tun?

$string = str_replace('"', '\\"', $string);

Insbesondere dann, wenn die Eingabe in einem Zeichensatz war, der ein gültiges Zeichen wie 0xbf5c haben könnte, so dass ein Angreifer 0xbf22 injizieren kann 0xbf5c22 zu bekommen, ein gültiges Zeichen von einem nicht notierten Anführungszeichen gefolgt verlassen ( ").

Gibt es einen einfachen Weg, um dieses Problem zu mildern, oder bin ich Missverständnis, das Problem in erster Linie?

(In meinem Fall die Zeichenfolge wird in den Wert Attribut eines HTML-Input-Tag: ' ". $ String'" echo input type = "text" value = '>';)

EDIT: Was das betrifft, was ist mit einer Funktion wie preg_quote ()? Es gibt kein charset Argument dafür, so scheint es in diesem Szenario völlig nutzlos. Wenn Sie die Möglichkeit haben, NICHT charset auf UTF-8 zu begrenzen (ja, das wäre schön), scheint es, wie Sie wirklich behindert werden. Was ersetzen und Angebotsfunktionen sind in diesem Fall zur Verfügung?

War es hilfreich?

Lösung

Nein, du bist rechts: eine Einbyte- String-Funktion auf einem Multibyte-String verwenden kann ein unerwartetes Ergebnis führen. Verwenden Sie die Multibyte-String-Funktionen statt, zum Beispiel: mb_ereg_replace oder mb_split :

$string = mb_ereg_replace('"', '\\"', $string);
$string = implode('\\"', mb_split('"', $string));

Bearbeiten Hier ist eine mb_replace Implementierung der Split-Join-Variante mit:

function mb_replace($search, $replace, $subject, &$count=0) {
    if (!is_array($search) && is_array($replace)) {
        return false;
    }
    if (is_array($subject)) {
        // call mb_replace for each single string in $subject
        foreach ($subject as &$string) {
            $string = &mb_replace($search, $replace, $string, $c);
            $count += $c;
        }
    } elseif (is_array($search)) {
        if (!is_array($replace)) {
            foreach ($search as &$string) {
                $subject = mb_replace($string, $replace, $subject, $c);
                $count += $c;
            }
        } else {
            $n = max(count($search), count($replace));
            while ($n--) {
                $subject = mb_replace(current($search), current($replace), $subject, $c);
                $count += $c;
                next($search);
                next($replace);
            }
        }
    } else {
        $parts = mb_split(preg_quote($search), $subject);
        $count = count($parts)-1;
        $subject = implode($replace, $parts);
    }
    return $subject;
}

Wie die Kombination von Parametern in Bezug auf dieser Funktion wie der Einbyte- str_replace verhalten soll.

Andere Tipps

Der Code ist vollkommen sicher mit gesund Multibyte-Kodierungen wie UTF-8 und EUC-TW, aber gefährlich mit gebrochen denjenigen wie Shift_JIS, GB * usw. Rather durch alle die Kopfschmerzen als zu gehen und Kopf sicher mit diesen Legacy-Kodierungen zu sein, würde ich empfehlen, gerade nur UTF-8 unterstützt.

können Sie entweder mb_ereg_replace verwenden, indem zuerst die charset mit mb_regex_encoding() angeben. Alternativ, wenn Sie UTF-8 verwenden, können Sie preg_replace mit dem u Modifikator verwenden können.

Von dem, was ich verstehe, viel von dieser Art von String-Injektion wird durch die mysql_real_escape_string gelöst (); Funktion.

http://php.net/manual/en/ function.mysql-real-escape-string.php

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