Каждой атаке положен
официальный сайт. Вот, например.
Если использовать уникодные символы управления направлением вывода текста (слева направо интерпретировать кусок текста или справа налево), то можно добиться эффекта, когда человек, который ревьюит pull-request, увидит одно, а компилятор - совсем другое
(
Read more... )
Reply
Не особого удобства, а возможности выражать некоторые вполне легитимные потребности в двуязычном тексте. Например, они становятся нужны, когда в тексте на RTL-языке встречается слово из LTR-языка в скобках или кавычках. (Потому что нужно, чтобы LTR-островок начинался со скобки, а по умолчанию он начнётся с первой буквы.)
Поэтому запрещать bidi override нельзя, а читать надо не журналистский пересказ, а Unicode® Standard Annex #9: Unicode Bidirectional Algorithm.
Reply
Reply
Чтение стандарта даёт понимание происходящего несколько более конкретное, чем журналистского пересказа сайта, на который ссылка в исходном посте. (Который сам - журналистский пересказ статьи, выложенной на нём.)
А понимание - это как раз то, что и уберегает от атаки. Я вот себе выставил в среде отображение bidi override’ов наряду с пробелами и табами.
Reply
Reply
Reply
На мой взгляд, правильным решением было бы требовать парности символов переключения направления внутри отдельной строковой константы или комментария (причем для многих языков - внутри каждой отдельной строки комментария).
Ежели же тебе нужно формировать вывод из маленьких кусочков и выводить символы переключения направления отдельным вызовов функции print, то вот тут как раз эскейп-последовательность читаемость кода скорее улучшит, чем ухудшит.
Reply
Reply
Reply
А человек, который реализовал большую часть поддержки bidi в Emacs’е, говорит, что нет: оверрайды-де автоматически закрываются на конце абзаца, и поэтому строки без явной закрывашки валидны.
Background: его там пытаются уговорить, что все bidi-управляющие символы нужно отображать специальными значками и цветом, а он отбивается, что если так сделать, то все нормальные люди, пользующиеся в жизни RTL-языками, немедленно это отключат как мешающее жить.
Reply
Вот да, мне кажется, логично считать каждый строковый литерал и каждый однострочный комментарий LTR-контекстом, требовать внутри него корректной вложенности, а при нарушении pop’ать всё, что не закрыто.
Что делать с многострочными строковыми литералами и комментариями, не совсем ясно. С одной стороны, несколько строк комментария могут составлять абзац и в нём островок изменённой направленности может быть перенесён между строчками. А с другой стороны, многострочные комментарии тоже могут быть использованы во зло.
#include
int main() {
/* Pretend to greet the user
* or maybe to check some privilege.
/*
printf("Hello World!\n");
/* That’s all, folks! */
}
Reply
то каждая строка в целом - LTR контекст.
А вот комментариях - скобках, как в C++ или паскале, можно делать многострочный RTL контекст.
При условии что сами скобки, ограничиавющие комментарий - в LTR-контексте.
Reply
Leave a comment