Vraag Welke tekens moeten worden geëscaped om (My) SQL-injecties te voorkomen?


Ik gebruik de functie van MySQL API

mysql_real_escape_string()

Op basis van de documentatie ontsnapt het aan de volgende tekens:

\0
\n
\r
\
'
"
\Z

Nu keek ik in de ESAPI-beveiligingsbibliotheek van OWASP.org en in de Python-poort had het de volgende code (http://code.google.com/p/owasp-esapi-python/source/browse/esapi/codecs/mysql.py):

        """
        Encodes a character for MySQL.
        """
        lookup = {
        0x00 : "\\0",
        0x08 : "\\b",
        0x09 : "\\t",
        0x0a : "\\n",
        0x0d : "\\r",
        0x1a : "\\Z",
        0x22 : '\\"',
        0x25 : "\\%",
        0x27 : "\\'",
        0x5c : "\\\\",
        0x5f : "\\_",
        }

Nu vraag ik me af of al die karakters echt nodig zijn om te worden ontsnapt. Ik begrijp waarom% en _ er zijn, het zijn meta-tekens in de LIKE-operator, maar ik begrijp niet eenvoudig waarom ze backspace- en tabulator-tekens (\ b \ t) hebben toegevoegd? Is er een beveiligingsprobleem als u een zoekopdracht uitvoert:

SELECT a FROM b WHERE c = '...user input ...';

Waar gebruikersinvoer tabulators of backspace-tekens bevat?

Mijn vraag is hier: waarom hebben ze \ b \ t opgenomen in de ESAPI-beveiligingsbibliotheek? Zijn er ieder situaties waarin je misschien aan die personages moet ontsnappen?


14
2017-07-06 13:21


oorsprong


antwoorden:


De MySQL handleidingpagina voor strings zegt:

  • \0Een ASCII NUL-teken (0x00).
  • \'Een enkel citaat ("'") Karakter.
  • \"Een dubbel aanhalingsteken (""") Karakter.
  • \bEen backspace-teken.
  • \nEen nieuwlijn (linefeed) teken.
  • \rEen carriage return karakter.
  • \tEen tab-teken.
  • \ZASCII 26 (Control-Z). Zie opmerking na de tabel.
  • \\Een backslash ("\") Karakter.
  • \%EEN "%"Karakter. Zie opmerking na de tabel.
  • \_EEN "_"Karakter. Zie opmerking na de tabel.

14
2017-07-06 14:14



Een schatting met betrekking tot het backspace-teken: stel je voor dat ik je een e-mail stuur "Hallo, hier is de vraag om je database bij te werken zoals je wilde" en een bijgevoegd tekstbestand met

INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);

Je kat het bestand, ziet dat het goed is en pijpt het bestand gewoon naar MySQL. Wat je echter niet wist, was dat ik stopte

DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b

vóór de INSERT-VERKLARING die je niet hebt gezien omdat op de console-uitvoer de backspaces het hebben overschreven. Bamm!

Maar een gok.

Bewerken (kon niet weerstaan):

alt text


42
2017-07-06 13:34



Blacklisting (het identificeren van slechte karakters) is nooit de juiste keuze, als je nog andere opties hebt.

U moet een conbinatie van whitelisting en, belangrijker, bound-parameterbenaderingen gebruiken.

Hoewel dit specifieke antwoord een PHP-focus heeft, helpt het nog steeds veel en zal het helpen verklaren dat het uitvoeren van een string door een char-filter in veel gevallen niet werkt. Alsjeblieft, alsjeblieft Helpen htmlspecialchars en mysql_real_escape_string mijn PHP-code veilig te houden voor injectie?


4
2017-07-06 14:04



Waar gebruikersinvoer tabulators of backspace-tekens bevat?

Het is vrij opmerkelijk dat de meeste gebruikers tot op de dag van vandaag geloven dat dat zo is gebruikers invoer moet worden ontsnapt en dergelijke ontsnapping "voorkomt injecties".


0
2018-05-01 05:09



Java-oplossing:

public static String filter( String s ) {
    StringBuffer buffer = new StringBuffer();
    int i;

    for( byte b : s.getBytes() ) {
        i = (int) b;

        switch( i ) {
            case  9 : buffer.append( "    " ); break;
            case 10 : buffer.append( "\\n"  ); break;
            case 13 : buffer.append( "\\r"  ); break;
            case 34 : buffer.append( "\\\"" ); break;
            case 39 : buffer.append( "\\'"  ); break;
            case 92 : buffer.append( "\\"   );

            if( i > 31 && i < 127 ) buffer.append( new String( new byte[] { b } ) );
        }
    }

    return buffer.toString();
}

0
2017-09-09 09:55



kan iemand niet zomaar de enkele quote (s) uit de gebruikersinvoer verwijderen?

bijvoorbeeld: $input =~ s/\'|\"//g;


-2
2018-03-13 12:54