2

取得した入力が HTML エンコードされているかどうかわからない状況があります。どうすればこれを処理できますか? jQueryも用意しています。

function someFunction(userInput){
    $someJqueryElement.text(userInput);
}

// userInput "<script>" returns "&lt;script&gt;", which is fine
// userInput "&lt;script&gt;" returns &amp;lt;script&amp;gt;", which is bad

アンパサンド ( ) をエスケープすることは避け&られますが、それにはどのようなリスクがありますか? どんな助けでも大歓迎です!

重要な注意: このユーザー入力は、私の管理下にありません。これは外部サービスから返され、誰かがそれを改ざんして、そのサービス自体が提供する html エスケープを回避する可能性があります。

4

2 に答える 2

2

予測が非常に困難な状況になるため、これらの状況を確実に回避する必要があります。

関数に追加の変数入力を追加してみてください。

function someFunction(userInput, isEncoded){
    //Add some conditional logic based on isEncoded
    $someJqueryElement.text(userInput);
}

fckEditor などの製品を見ると、ソースを編集するか、リッチ テキスト エディターを使用するかを選択できます。これにより、自動エンコード検出の必要がなくなります。

それでも html エンコーディング文字の自動検出に固執する場合は、 index of を使用して特定のキー フレーズが存在することを確認することをお勧めします。

str.indexOf('&lt;') !== -1

上記の例では、< 文字が検出されます。

~~~この行の下に編集後に追加された新しいテキスト.~~~

最後に、この回答を見ることをお勧めします。彼らは、デコード機能を使用して長さを検出することを提案しています。

var string = "Your encoded &amp; decoded string here"

function decode(str){
    return decodeURIComponent(str).replace(/&lt;/g,'<').replace(/&gt;/g,'>');
}

if(string.length == decode(string).length){
    // The string does not contain any encoded html.
}else{
    // The string contains encoded html.
}

繰り返しになりますが、ユーザーが特別にエンコードされた文字を入力してプロセスを偽装するという問題が残っていますが、それが html エンコーディングです。したがって、これらの文字シーケンスのいずれかが出現したらすぐに html エンコーディングを想定するのが適切です。

于 2013-08-05T14:57:29.810 に答える
1

HTML のような構造化言語に連結する前に、信頼できない入力を常に正しくエンコードする必要があります。

そうしないと、XSS などのインジェクション攻撃が可能になります。

入力に ​​HTML フォーマットが含まれていると思われる場合は、サニタイザー ライブラリを使用して、安全でない可能性のあるすべてのタグと属性を削除する必要があります。

正規表現を使用して/<|>|&(?![a-z]+;)、文字列にエンコードされていない文字が含まれているかどうかを確認することもできます。ただし、エンコードされた文字列とエンコードされていない文字列を区別することはできません。

于 2013-08-05T14:55:08.760 に答える