Was macht dieser preg_replace? (/ [\ xF0- \ xF7] ... /)

8

Offensichtlich sind $ data die Zeichenfolge und wir entfernen die Zeichen, die den reg-Ausdruck erfüllen, aber welche Zeichen werden von /[\xF0-\xF7].../?

angegeben %Vor%

Was ist auch die Bedeutung dieser Zeichen ersetzt werden?

Edit for Bounty: Genauer gesagt, welcher Exploit versucht dies zu verhindern? Die Daten werden später in mysql-Abfragen (nicht-pdo) verwendet, also nehme ich an, dass irgendeine Art von Injektionsangriff mit diesen Charakteren verbunden ist? Oder nicht? Ich versuche, die Logik hinter dieser Codezeile in einem Skript zu verstehen, das ich gerade lese.

    
user1796995 30.11.2012, 23:02
quelle

4 Antworten

20

Er entfernt die 4-Byte-Sequenz aus der Unicode-Zeichenfolge. In diesem ersten Byte ist immer [\xF0-\xF7] und drei Punkte sind der Rest von 3 Bytes.

Nach Ссылка :

  

Der Zeichensatz utf8 verwendet maximal drei Bytes pro Zeichen und enthält nur BMP-Zeichen.

MySQL mit der ausgewählten utf8-Codierung kann Text an der Stelle abschneiden, an der die Sequenz angezeigt wird, und wenn die Fehlerberichterstattung nicht auf strict_trans_tables eingestellt ist, kann sie stillschweigend ausgeführt werden, anstatt Fehler wie SQLSTATE[HY000]: General error: 1366 Incorrect string value: zu werfen.

Siehe diese für weitere Referenz:

Das potentielle Abschneiden kann zur Ausnutzung führen.

Zum Beispiel gibt es eine Website mit dem Benutzer admin . Website erlaubt jedermann sich zu registrieren. Mit abgeschnittenen Strings wird es wahrscheinlich möglich sein, ein weiteres admin mit verschiedenen E-Mails einzufügen, wobei die einmalige Überprüfung umgangen wird. Sperren Sie dann das Konto und versuchen Sie es mit dem Wiederherstellungsvorgang. Es wird eine Abfrage wie SELECT * FROM users WHERE name = 'admin' und seit original admin ist der erste Datensatz Angreifer wird sein Passwort wiederherstellen.

    
Sam Dark 13.01.2014, 23:25
quelle
1

Es entspricht einem von 8 Byte Werten plus drei weiteren Zeichen und entfernt den Block von 4 Zeichen. So viel sagst du schon. Leider können wir Ihnen ohne weiteren Kontext nicht sagen, warum diese 8 Bytes von Bedeutung sind. Sie sind harmlos, unabhängig davon, für welches Zeichen sie stehen (Zeichencodierung). Meine beste Vermutung ist, dass in der Anwendung, von der es kommt gibt es eine gewisse Bedeutung für diese 8 Zeichen als Marker irgendeiner Art. 0xF0 ist 11110xxx, das erste Byte eines 32-Bit (4 Byte) UTF-8-Zeichens, also vielleicht alle 32-Bit-UTF-8-Zeichen entfernen? Werden 16 und 24 Bit Zeichen (110xxxxx und 1110xxxx erstes Byte) ähnlich behandelt?

    
Phil Perry 13.01.2014 23:25
quelle
0

Damit wird die 4-Byte-Sequenz aus der Unicode-Zeichenfolge entfernt. In diesem ersten Byte ist immer [\ xF0- \ xF7] und drei Punkte sind der Rest von 3 Bytes.

Referenz von Nach Ссылка :

    
junaid ali 20.01.2014 14:25
quelle
0

preg_replace('/[\xF0-\xF7].../', '', $data) ersetzen:

(xF0 bis xF7) + drei nächste Zeichen mit einer leeren Zeichenfolge (das Symbol + steht für eine Verkettung, keine Addition)

    
Manolo 20.01.2014 17:09
quelle

Tags und Links