Я пишу некоторые модульные тесты, чтобы убедиться, что мой код не уязвим для SQL-инъекции под различными кодировками.
В соответствии с этим ответом вы можете создать уязвимость, введя \xbf\x27, используя один из следующих кодировок: big5, cp932, gb2312, gbk и sjis
Это связано с тем, что если ваш escaper настроен неправильно, он увидит 0x27 и попытается избежать его, чтобы он стал \xbf\x5c\x27. Тем не менее, \xbf\x5c на самом деле является одним символом в этих кодировках, поэтому цитата (0x27) оставлена без привязки.
Однако, как я обнаружил в ходе тестирования, это не совсем так. Он работает для big5, gb2312 и gbk, но не 0xbf27 или 0xbf5c являются допустимыми символами в sjis и cp932.
Оба
mb_strpos("abc\xbf\x27def","'",0,'sjis')
и
mb_strpos("abc\xbf\x27def","'",0,'cp932')
Возврат 4. т.е. PHP не видит \xbf\x27 как один символ. Это возвращает false для big5, gb2312 и gbk.
Кроме того, это:
mb_strlen("\xbf\x5c",'sjis')
Возвращает 2 (он возвращает 1 для gbk).
Итак, возникает вопрос: существует ли еще одна последовательность символов, которая делает sjis и cp932 уязвимыми для SQL-инъекции или они вообще не уязвимы? или PHP лежащий, я полностью ошибаюсь, и MySQL будет интерпретировать это совершенно по-другому?