エディターのコードを信じることができますか? 双方向テキスト

def maps(): print "maps maps maps" def spam(): print "Erasing everything..." print "done." 

非常に長い時間次の行を見ると、「スパム」という言葉が3つだけ残っていることを知っていますか?

 s = "spam‮" ,spam ,"‬spam" s[1]() 

実際、最初の行は非常に珍しいです。 一般的に、悪意のあるスパム機能はこのコードの結果として実行されます。

イデオンを見る (知らない人のために:以下に実行されたプログラムの結論があります)

Rlo


双方向の書き込みに関する問題の中心にあるのは、テキストは常に人が書いた順序でメモリに保存されるという考え方です。 テキストを通常の方向に描画する右から左への書き込みを含む。

レンダリングの方向は、特定のアルファベット(ヘブライ語など)に属する記号によって自動的に決定されます。句読点または数字の場合は、コンテキストに応じてよりunningなルールによって決定されます。

RLO- フォーマット文字。 右から左へのオーバーライドを表します 。 デフォルトの左利きの文字の場合、書き込みの方向を右利きに変更します。 (標準では、ヘブライ語と英語が混在している場合、 これらのような識別子を記述するために使用できるとされており、明らかに、英語のインクルージョンは自然に右から左に読み取られます)。

さて。 彼のおかげで、私たちは魅力を得ることができます:
  s = "spam <RLO>"、spam、 "<PDF> spam" 
  s =「スパム」、スパム、「スパム」 

PDFはポップ方向のフォーマットを表し、最後のRLOまたはそのフレンドの効果を破棄します

インタプリタは、文字列リテラルの理解できない文字に無関心であると推測するのは簡単です。 ただし、emacs *、Xcode、Kateなどの一部のエディターは、ブラウザーとまったく同じように中間テキストを展開します。

* emacsの場合、おそらく動作は端末に依存します。 しかし、vimとnanoでは、同じ端末で問題はありません。両方とも、対応する位置にRLO文字コードのみを表示します。

コードの他の用途について


RLO文字は空白ではありません。さらに、Python 識別子の一部としてそれを誓いますが、これはアプリケーションの範囲をわずかに制限します。

文字列リテラルまたはコメントに配置する必要があります。 同時に、ファイルの各行の終わりまでに、段落として、RLOアクションが終了します。

写真


ヴィム


崇高なテキスト


xcode


emacs


...そして再びideoneへリンク

upd:埋め込みとマークにはまだそのようなオプションがあります

ボーナス

「Rm -rf echo」。実際には「rm -rf」のみが出力されます。
 echo -e '\xe2\x80\x8f\xe2\x80\xaaecho \xe2\x80\xac\xe2\x80\x8f\xe2\x80\xaarm -rf \xe2\x80\xac\xe2\x80\x8f' 

何らかの理由で、bashはコマンドの先頭にあるフォーマット文字を無視します。これにより、悪用の余地が大きくなります。

Source: https://habr.com/ru/post/J252813/


All Articles