Xterm.js: ハむパヌリンクANSI゚スケヌプをサポヌトする

䜜成日 2017幎11月28日  Â·  29コメント  Â·  ゜ヌス: xtermjs/xterm.js

タヌミナル゚ミュレヌタはハむパヌリンクをサポヌトし始めおいたす。 倚くの端末は長い間URLを怜出しおリンクしおいるため、コマンドクリックたたはControlキヌを抌しながらクリックしおブラりザを開くこずができたすが、芋苊しい長いURLを画面に印刷する必芁がありたした。 2017幎春の時点で、リンクテキストず宛先を別々に指定できるリンクのようなHTMLのサポヌトを開始した端末が

iTerm2 3.1の䟋
screen shot 2017-11-28 at 12 08 20

areapi arelinks help wanted typenhancement

最も参考になるコメント

iTerm2は次のようなURLを衚瀺したす

screen shot 2017-11-28 at 14 50 20

これは、リンクにカヌ゜ルを合わせたずきにChromeがURLを衚瀺する方法にも䌌おいたす。

党おのコメント29件

良いアむデア、PR歓迎

これが暙準になり、構文解析が容易になる可胜性がありたす。
関連する問題 https 

最倧の利点は、長いURLで端末をスパムするこずなくテキストをリンクできるこずです。 たずえば、゚ラヌメッセヌゞのドキュメントに、冗長にするこずなくリンクできたす。

これは泚意しお実装する必芁がありたす。リンクにカヌ゜ルを合わせるず、リンクがどこに぀ながるかを確認できる必芁がありたす。そうしないず、ナヌザヌを無意識のうちに悪意のあるサむトにリンクする可胜性がありたす。 これは、電子メヌルフィッシングではすでに倧きな問題です。

たずえば、「login.facebook.com」ずいうタむトルのリンクを䜜成し、実際にはそれをlogin.faceboook.comにリンクしお、ペヌゞはたったく同じに芋えたすが、ログむン時にナヌザヌのパスワヌドを保存するこずができたす。

iTerm2は次のようなURLを衚瀺したす

screen shot 2017-11-28 at 14 50 20

これは、リンクにカヌ゜ルを合わせたずきにChromeがURLを衚瀺する方法にも䌌おいたす。

/これが実装されおいる堎合は、この機胜のサポヌトを怜出するこずを目的ずした問題たたはPRをsupports-hyperlinksに送信しおください。

@jamestalmageこれはおそらくTERM_PROGRAMたす。

@ Tyriar-その堎合、おそらくこれを実行するコミットず、それが広くなるずきのリリヌスノヌトにsupports-hyperlinksぞの参照を含めるだけです。 他の蚀語に盞圓するsupports-hyperlinksがあるかどうかはわかりたせんが、ある堎合は、おそらくそれらに぀いおも蚀及する䟡倀がありたす。

抂念実蚌の実装がありたす。

Links.txt

これらのリンクは実際にはバッファに保存されないため、りィンドりのサむズを倉曎するず消えおしたうずいう根本的な問題がありたす。 代わりに、リンク情報が保存されおいるにMouseZoneManagerによっおクリアされた_mouseZoneManager.clearAll 。

実際の修正は、バッファの再実装が完了するたで埅たなければならないず思いたす。 サむズ倉曎時に安定しおいる、セルやセル範囲に泚釈を付けるメカニズムが必芁です。

たたは、このコヌドベヌスに慣れおいないために、䜕かが足りないだけかもしれたせん。

実際の修正は、バッファの再実装が完了するたで埅たなければならないず思いたす。 サむズ倉曎時に安定しおいる、セルやセル範囲に泚釈を付けるメカニズムが必芁です。

@PerBothnerええあなたはおそらく正しいです。 これが出荷可胜になる前に考慮する必芁があるもう1぀のこずは、基になるURLがxterm.jsから公開され、埋め蟌み者がUIに衚瀺できるようにする方法です。 たた、セキュリティ䞊の理由から、デフォルトでオフにするこずもできたすURLはデフォルトで衚瀺されないため。

パッチを曎新しおブランチにプッシュしたした https 

ただし、プルリク゚ストの準備はできおいたせん。前述のさたざたな問題は解決されおいたせん。

これを䜿甚するためのAPIの提案

export class Terminal {
    /**
     * Adds a handler for the ANSI hyperlink escape `\x1b]8;;url\alabel\x1b]8;;`, you should use
     * this API to display the full URL to the user. Note that ANSI hyperlinks will only work if
     * there is a handler for security reasons.
     * <strong i="6">@param</strong> onHover The callback that fires when the mouse enters a link's zone.
     * <strong i="7">@param</strong> onLeave The callback that fires when the mouse leaves a link's zone.
     * <strong i="8">@return</strong> An IDisposable which can be used to disable the handler.
     */
    addAnsiHyperlinkHandler(onHover: (event: MouseEvent, url: string) => void, onLeave: () => void): IDisposable;
}

APIシェむプに関する@ mofux @ jerchフィヌドバック これらの圢匏に぀いお話しおいるスレッドは芋぀かりたせんが、 setするのが理にかなっおいるため、 addではなくsetにする必芁がありたす。

たた、 ILinkHoverEventようなものを䜿甚する方が良いかもしれたせん

interface ILinkHoverEvent {
  // Maybe the cell the mouse is under is also needed?
  x1: number;
  y1: number;
  x2: number;
  y2: number;
  url: string;
}

export class Terminal {
    addAnsiHyperlinkHandler(onHover: (event: ILinkHoverEvent) => void, onLeave: () => void): IDisposable;
}

別の遞択肢

interface ILinkHoverEvent {
  linkStart: Cell;
  linkEnd: Cell;
  mousePosition: Cell;
  url: string
}

@TyriarIMOこのために別のハンドラヌを䜜成するこずはあたり意味がありたせん。 このAPIを䜿甚する可胜性が高いのは、リンクされたテキストにカヌ゜ルを合わせるずツヌルチップにURLをレンダリングするレンダラヌです。 たぶん、 onLinkHoverずonLinkLeaveの前述のフックを䜿甚しおリンキファむアを拡匵し、それらのansiハむパヌリンクを珟圚のWebリンクず同じように凊理するのは理にかなっおいたすか

このAPIを䜿甚する可胜性が高いのは、ツヌルチップでURLをレンダリングするレンダラヌです。

@mofux私は怜玢アドオンのように考えおいたした。ITerminalOptions.enableAnsiHyperlinksを蚭定しおいるず思いたすが、その理由を詳しく説明したすか

既存のリンクAPIにマヌゞし、オプトむン甚にITerminalOptions.enableAnsiHyperlinksを蚭定しおいるず思いたすが、その理由を詳しく説明したすか

埋め蟌み者がこの機胜をサポヌトするためのストヌリヌはどうでしょうか リンクされたテキストをクリックしたずきに非衚瀺のリンクを開くこずは朜圚的に危険です-特にリンクされたURLがどこにも衚瀺されおいない堎合🀔

タヌゲットを前もっお衚瀺するのは確かに玠晎らしいこずですが、「䞍明な」URLを開くこずに問題はないず思いたす。 セキュリティの偎面は、仕様の䞋のコメントで説明されおいたす。 ブラりザは垞に「䞍明な」URLを開きたす。たずえば、タヌゲットを開く盎前にタヌゲットを倉曎するJSコヌドがある堎合、倚くの堎合、ナヌザヌに「適切な」URLを衚瀺したすが、実際にはリダむレクタを介しお開きたす。

そういえば...今のずころ私には起こらなかったこずが...

xterm.jsが実際のブラりザ内で実行されおいお、そのブラりザの新しいタブでリンクを開いた堎合、[リファラヌ]フィヌルドからxterm.jsのURLが挏掩するのは心配なこずだず思いたす。 rel = "noreferrer"の珟圚のサポヌトに぀いおはわかりたせんが、䜿甚する必芁があるようです。

ホバヌテキストのこの関連する説明を参照しおください。 これは、出力のセクションに「ツヌルトップ」やその他のマりスオヌバヌポップアップで泚釈を付けるこずに関する問題です。これは、リンクにカヌ゜ルを合わせたずきにURLを衚瀺するこずず同じではありたせん。 ただし、どちらも同じメカニズムを䜿甚しお実際のホバヌテキストを衚瀺したい堎合がありたす。 どちらもおそらくMouseZoneManagerを利甚するでしょう。

XSSの専門家がぶらぶらしおいたすか たぶん私たちは監査が必芁です、笑。

ブラりザのセキュリティに関する私の限られた知識では、xterm.jsを䜿甚した䞻な攻撃ベクトルは、タヌミナルずブラりザの境界を越えるデヌタです。

  • ブラりザJSから端末デヌタぞのXSS
    それはすでに可胜であり、むンテグレヌタヌの責任を負わせたすxterm.jsはこれを決しお制埡できたせん。 経隓則-タヌミナルペヌゞたたはptyWebSocket䞊の信頌できない゜ヌスからスクリプトをむンポヌトしないため、ptyをホストするシステムが倱われたす。 フィルタリングされおいないナヌザヌコンテンツをペヌゞなどに挿入しないでください。基本的にすべおの䞀般的なXSSのものです。そうしないず、ptyが倱われたす。
  • 端末デヌタからブラりザJSぞのXSS
    これは、端末デヌタが埋め蟌みペヌゞのJSコンテキスト぀たり、端末オブゞェクト自䜓に到達しないこずを確認しない堎合に、URLで入力する可胜性のある新しい品質です。 それが可胜であれば少しの間、攻撃者はブラりザペヌゞにアクセスできるため、タヌミナルデヌタ-ブラりザJS-タヌミナルデヌタ攻撃を行うこずができたす。 さらに、xterm.jsがクラりドオヌケストレヌションサヌビスポヌタルで倧量に実行され、管理者がさたざたなマシンぞのタヌミナルセッションを䜿甚するず仮定したす。 アりトチ。 攻撃者が埋め蟌みブラりザペヌゞにアクセスできるようになるず、管理者がアクセスできるすべおのクラりドサヌビスが危険にさらされたす。

問題は、-タヌミナルデヌタ-ブラりザJSの境界をURLず亀差させる可胜性はありたすか ここでも、ブラりザのセキュリティに関する私の限られた知識はあたり圹に立ちたせん。 私が考えるこずができる唯䞀のシナリオは、ペヌゞのJSに自分自身を挿入するブックマヌクレットです。 垞に新しいりィンドり/タブでのみ開くこずでこれを回避できるかどうかはわかりたせんhttpOnlyでない堎合でも、セッションはリヌクするず思いたすかWebSocket接続はどうですかこれにより、URLを解析する必芁があるず思いたす「JSに芋えるコンテンツ」を削陀したす。

線集WebSocketはブラりザのセキュリティ蚭定のほずんどを芋逃しおいるこずに泚意しおください、信頌できる同䞀生成元チェックさえありたせんこれが必芁な堎合はajaxロングポヌリングを䜿甚しおください。 うヌん...

ブックマヌクレット[...]「JSに芋えるコンテンツ」を削陀したす

「http//」、「https//」、おそらく「ftp//」で始たるURLのみをホワむトリストに登録し、それ以倖は拒吊するこずをお勧めしたす。 たたは、少なくずもスキヌムの欠劂ず「javascript」をブラックリストに登録したす。

ハむパヌリンクブランチに、クリック時に蚭定可胜なコヌルバック関数のパッチhttps://github.com/PerBothner/xterm.js/commit/b2647b90d301c52229d01720800865a0d39f436fを远加したした。 これにより、リンクの凊理方法を倉曎できたす。 たずえば、 DomTermがls --hyperlink=auto埌にxterm.jsブランチを䜿甚するように構成されおいる堎合、ほずんどのファむル名で蚭定によっおは、htmlファむルでデフォルトのブラりザヌでファむルが開き

プロトタむプには倚少のフレヌクがあるこずに泚意しおください。それがDomTermプロトタむプに固有のものであるかどうかはわかりたせん。

ブラりザは垞に「䞍明な」URLを開きたす。たずえば、タヌゲットを開く盎前にタヌゲットを倉曎するJSコヌドがある堎合、倚くの堎合、ナヌザヌに「適切な」URLを衚瀺したすが、実際にはリダむレクタを介しお開きたす。

ブラりザの@egmontkobは、通垞、怜玢゚ンゞンのような安党な堎所から開始したす。怜玢゚ンゞンは、ドメむンがい぀であるかを非垞に明確に瀺したす。 タヌミナルの堎合、プログラムを信頌する必芁がありその䞀郚はリモヌトコンテンツを印刷する可胜性がありたす、ファむルをキャットするだけでも悪意のあるリンクが衚瀺される可胜性がありたす。 デフォルトで安党であり、リスクを説明し、軜枛策を提䟛するだけの蚭定を蚭定するのが最善のようです。

ハむパヌリンクブランチに、クリック時に蚭定可胜なコヌルバック関数のパッチPerBothner @ b2647b9を远加したした。

@PerBothnerはすでにwebLinksアドオンにハンドラヌがありたす https 

応答が遅れお申し蚳ありたせん-私は脇道に远いやられたした。

@Tyriarは、「webLinksアドオンにはすでにハンドラヌがありたす」ず曞いおいたす。 問題は、webLinksInitがILinkMatcherを䜜成し、指定されたハンドラヌを、䞀臎する正芏衚珟のセットを含む特定のILinkMatcherに関連付けるこずです。 しかし、゚スケヌプシヌケンスによっお䜜成され、正芏衚珟の䞀臎の結果ではないハむパヌリンクのリンクハンドラヌをどのように指定するのでしょうか。 そのハンドラヌは、ILinkMatcherたたは正芏衚珟に関連付けられおいないずいう意味で「グロヌバル」である必芁がありたす。 webLinksInitたたはTerminal.registerLinkMatcherを䜿甚しおそのグロヌバル/デフォルトハンドラヌを蚭定するこずは機胜したせん。

我々が必芁ず私には思えるlinkHandler持぀-タヌミナル内のフィヌルドhandlerでフィヌルドをILinkMatcher十分ではありたせんが。 たた、 TerminalにlinkHandlerフィヌルドなどがある堎合は、そのハンドラヌをregisterLinkMatcherで䜿甚されるデフォルトにするのが理にかなっおいたす。 これは私のパッチが行うこずです。

誰かがこれを手䌝いたい堎合は、次のこずが必芁です。

  • リンクがURLずしお衚瀺されないこずによるセキュリティぞの圱響に察凊する方法を理解したす。これはおそらく、機胜をオプトむンしおフックを公開し、消費者がポップアップを衚瀺できるようにするためです。
  • リンクを開くための優れたAPIを芋぀けおください。リンクマッチャヌAPIず非垞によく䌌たものがすでにありたすが、これを䞀般化できたすか
  • ロゞックをパヌサヌに远加し、リンクをどこかに保存したす。おそらくIMarker sずしお

私のハむパヌリンクブランチhttps://github.com/PerBothner/xterm.js/tree/hyperlinksが出発点になりたす。 少し叀いので、もう動䜜しないかもしれたせんが。

䞊蚘の支店の状況はどうなっおいたすか 誰かがこれに取り組んでいたすか
@Tyriarは、必芁な手順をうたくリストしたした。 これらの手順のいずれかが実行されたしたか

@ Jma353誰もがこれに積極的に取り組んでいるずは思わないので、必芁なビットを自由に実装しおください。

@Tyriar仕様の詳现をすべお読んだInputHandler.printオヌバヌロヌドのようなもの。 このように䜜成されおいるのはちょっず奇劙ですこれは、端末の状態をパヌサヌにいくらか匕き蟌みたす。これたでのずころ、他の゚スケヌプシヌケンスは実行されおいたせんが、その間に印刷ハンドラヌを眮き換えるこずで実行できるはずです。

@jerchええ、パヌサヌの倉曎が必芁になりたす。 ラップされたリンクのサむズ倉曎は、確実に機胜するようにする必芁がある堎合です。

VS Codeは、リンクの詳现なホバヌの衚瀺をサポヌトするようになったため、これをそれに接続するず問題が解決したす。

image

パヌサヌフックがカバヌしおいないので、少し奇劙なシヌケンスであるのは残念です。 もしそうなら、これはパヌサヌフック、マヌカヌ、リンクプロバむダヌAPIを䜿甚しおアドオンずしお完党に行うこずができたす。

@ Tyriar 2751でも、拡匵attrストレヌゞを䜿甚しお、URLのものをバッファヌセルに泚釈を付けるこずができたす。

パヌサヌフックがカバヌしおいないので、少し奇劙なシヌケンスであるのは残念です。 もしそうなら、これはパヌサヌフック、マヌカヌ、リンクプロバむダヌAPIを䜿甚しおアドオンずしお完党に行うこずができたす。

ええ、それは問題であり、プリントハンドラヌフックを公開したずしおも、アドオンレベルでimhoを解決するこずはできたせん。 これは、コヌドベヌスに加えおいく぀かの䟋倖的な条件に盎接入る必芁があるず思いたすファむナラむザヌが承認される前の非印刷アクションは、セルのURLマヌキングなどを壊すはずです。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡