Двунаправленные символы в LTR-языках: пост о исправлении уязвимости

Я только что наткнулся на следующий PR:

Мне кажется, это может сделать легитимный текст на иврите или арабском нечитаемым.

Одно из решений, с которым я столкнулся, — отключить алгоритмы Unicode и просто отображать какое-либо представление непечатаемых символов (по-моему, это было реализовано в Pootle).
По сути, идея состоит в том, чтобы превратить:
This‎‏ text

В:
This<LRM><RLM> text

Таким образом пользователь сможет решить, является ли это вредоносным, поняв, какие именно символы используются, и, возможно, выбрать включение алгоритмов Unicode для правильного чтения текста.
Спасибо.

Спасибо, что подняли этот вопрос, мы уже учитывали эту проблему. Исправление, на которое вы сослались в исходном посте, применяется только к двунаправленным символам Unicode в блоках pre и code, будь то написанные вручную как HTML или сгенерированные из ``` размеченных блоков кода, поэтому это не должно быть проблемой для обычного текста на иврите или арабском в составленном сообщении.

Демо:

#include <stdio.h>

int main() {
    /* Say hello; newline<U+2067> /*/ return 0 ;
    printf("Hello world.\n");
    return 0;
}
#include 

int main() {
    /* Say hello; newline<U+2067> /*/ return 0 ;
    printf("Hello world.\n");
    return 0;
}

Тест: “שלום חבר” — Привет, друг

Без BIDI

Тест: “שלום חבר” — Привет, друг

Markdown:

Тест: "שלום חבר" — Привет, друг

Без BIDI

Тест: "שלום חבר" — Привет, друг

Это не самый лучший пример в мире, но суть вы уловили: это влияет только на исходный код, публикуемый на форуме. Использование BIDI-символов в исходном коде обычно не практикуется.

Приведу ещё один пример, где отсутствие RLM ломает предложение.

שלום לכולם ובמיוחד ל־Sam, Martin בחר לעזוב אותנו.

שלום לכולם ובמיוחד ל־Sam,‏ Martin בחר לעזוב אותנו.

Видите разницу?
Единственное изменение — это RLM. Я хотел поздравить Сэма и сообщить, что Мартин уходит (без обид).

Да, этот пример определённо намного лучше! Как видите, он продолжает работать и не затронут исправлением уязвимости :tada:

Хм, это не блок кода :slight_smile:
Я имел в виду, что внутри блока кода он не будет отображаться как ожидалось (в этом и заключается исправление, я прав?)

Да, но зачем вообще помещать это в блок кода?

Выдержка из gettext, нативные строки на иврите/арабском, такие случаи бывают.

В данном случае для случая с выбросом существуют обходные пути (скриншоты, загрузка вложений и т. д.), и также совершенно очевидно, что специальный символ находится на своём месте.

Риск, связанный с https://trojansource.codes/, выше, чем риск незначительного нарушения в крайне редких случаях.

Однако мое предложение разбивает предложение с помощью некоторых управляющих символов, поэтому замена RLM и LRM на или покажет пользователю, что были дополнительные символы, и теперь текст отображается без них, при этом предупреждая, что это может нарушить опыт использования, и предлагая возможность вручную вернуть их обратно при необходимости. Полное удаление символов без каких-либо индикаторов не оставляет пространства для взвешенных решений.

Кроме того, это также предотвратит использование троянского исходного кода, как вы упомянули, поскольку пользователь сможет видеть вредоносный код вместе с индикаторами.

Я постараюсь сделать несколько скриншотов из Pootle. Я не помню, чтобы в последние пару лет видел там опцию для отображения необработанных строк, хотя она была очень полезна, когда мы начинали исправлять локализацию LibreOffice.

Не понимаю, мы не удаляем, а заменяем, посмотрите мой пример выше

Понимаю, не лучше ли использовать их имена вместо сущностей Unicode?

Если в реальных условиях будут зафиксированы повторные случаи путаницы, мы, безусловно, сможем провести дополнительную настройку.