Я пишу некоторые модульные тесты, чтобы убедиться, что мой код не уязвим для 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 будет интерпретировать это совершенно по-другому?