雙向文字 QA(Trojan-Source 掃描)

confusables 抓出相似的*字元*,但隱形的 Unicode *方向格式控制*是另一種危害。嵌入/覆寫 (LRE/RLE/LRO/RLO/PDF)、隔離(LRI/RLI/FSI/PDI)與標記(LRM/RLM/ALM)可以悄悄改變文字的呈現順序。這既是 RTL 在地化 QA 的缺口,也是「Trojan Source」攻擊(CVE-2021-42574)的根源——覆寫控制讓原始碼讀起來與實際執行 不同。

本功能回報字串中的雙向控制字元、檢查嵌入/隔離是否平衡、推斷基底方向,並標記 Trojan-source 式的格式。 純標準函式庫(unicodedata);不匯入 PySide6。每個函式皆為純函式,因此在 CI 中完全具決定性。

無頭 API

from je_auto_control import (
    detect_bidi_issues, bidi_controls, has_bidi_controls,
    is_bidi_balanced, base_direction, is_trojan_source,
    strip_bidi_controls,
)

sneaky = "value = <RLO>admin<PDF>"     # RLO ... PDF
detect_bidi_issues(sneaky)
# {'controls': [{'index': 8, 'char': '<RLO>', 'name': 'RLO'}, ...],
#  'has_controls': True, 'balanced': True, 'base_direction': 'LTR',
#  'trojan_source': True}

is_trojan_source(sneaky)        # True
strip_bidi_controls(sneaky)     # 'value = admin'
base_direction("אב")            # 'RTL'

bidi_controls 將每個控制字元列為 {index, char, name}is_bidi_balanced 檢查 PDF 關閉一個嵌入/覆寫、 PDI 關閉一個隔離,且正確巢狀。base_direction 依第一個強方向字元回傳 LTR / RTL / NEUTRALis_trojan_source 在出現任何非標記格式控制或巢狀不平衡時為真。strip_bidi_controls 回傳乾淨副本。 detect_bidi_issues 將全部打包為一份報告。

執行器命令

AC_bidi_check 回傳完整報告;``AC_bidi_strip`` 回傳移除控制字元後的 {text}。兩者皆以 MCP 工具 (ac_bidi_check / ac_bidi_strip)以及 Script Builder 中 Data 分類下的命令提供。