2017-07-21 32 views
3

JavaScript文字列を入力するとき、エスケープシーケンスにいくつかの解析が適用されます。
など、var foo = "ab\\cd";fooの値をab\cdとします。JavaScript文字列をテキストのように解析する方法

私は文字列としてJavaScriptコードを取り、そこから変数値を抽出する必要がありますが、そうするとエスケープシーケンスは適用されません。最初に文字列値を入力する場合と同様に、テキスト解析を再適用するにはどうすればよいですか。

fiddleの例を示します。シンプルなので、ここにコードを含めます。

HTML:

<a href="javascript:alert('abc\/def');" oncontextmenu="log(this)">Click or right click</a> 

Javascriptを:

function log(el){ 
    var href = el.getAttribute('href'); 
    var str = href.split("'")[1]; 
    alert(str); 
} 

リンクをクリックすると、abc/defに警告したが、右の意志出力abc\/defをクリックします。

右クリックアラートを左クリックと同じようにするにはどうすればよいですか?

答えて

2

一つの方法を使用すると、すべての文字列エスケープが適用されていることを確認したい場合は、文字列値の割り当てを実行するためにevalを使用することです。

eval("str = '" + str + "'") 

か、それは、あなたが不明瞭な文字列

str = 'abc\/def' 

を構築し、それを渡すことで、コードとしてそれを実行しているのケースでは、新しい構文(テンプレート文字列)

eval(`str = '${str}'`) 

を使用してeval

この一般的なアプローチには顕著なリスクがあります。あなたの例にはあてはまらないので、これを前に呼び出すことは考えていませんでした。しかし、これは非常に重要である可能性があなたの本当のユースケースに応じて:

文字列データ場合はではありませんが、適切にコード内の文字列リテラルであるように、これは予想外の結果を持っている可能性が脱出しました。文字列が信頼できないソースから生成された場合、予期しない結果が悪用される可能性があります。基本的に、ユーザー主導型の入力を受け取り、そこから評価文字列を作成する場合、このようにSQLクエリを作成する場合と同じ理由で文字列を事前に検証する必要があります。

もちろん、SQLクエリを作成する場合、問題を回避するクエリにユーザー入力を補間するためのより良い方法があります(したがって、ユーザー入力をクエリ文字列に連結することは一般に不適切な方法です)。私はこの目的に合った同様のツールを考えることはできません。私が言えることは、このテクニックを使用し、入力が信頼できないソースから来た場合は、慎重に進んでください。

あなたがしようとした場合'splitはそれを拒否します(そして、あなたがhrefから射出ペイロードを除外する"を注入しようとした場合に注入するので、あなたの例では、本当に危険な値を注入することは難しいだろうあなたのeval文字列テンプレートに"を使用しても、大丈夫です。それでも、一つは(リテラル未終端文字列を持っている)あなたは、文字列

str = '\' 

をevalにしようとしてしまう

<a href='\'> 

のようなHTMLスニペットと一部トラブルを引き起こす可能性があります。

HTMLのソースを適切に管理している場合は、大丈夫です。評価ステートメントの一部として使用される文字列をサニタイズするために、より意図的なコードを持つことは良い習慣です

-1

この正規表現を試してみてください。

href = href.replace("\/", ""); 
関連する問題