2009-03-19 9 views
1

私のアプリケーションでは、ユーザーがテンプレートに適用できるようにCSSスタイルシートをアップロードできるようにしています。この時点では、CSSスタイルシートを他のユーザーに公開したくないため、CSSは内部スタイルシートとして書かれています。ユーザ入力のCSSをフィルタリングするにはどうすればよいですか?

これは、ユーザーが悪意のあるコードをcssファイルに含める余地を作り出します。最初は私の計画はすべて '<'と '>'を変換することでしたが、それはCSS構文で必要です。私は白いリストの解決策をとっています。なぜなら、不要な文字を徹底的に排除することは不可能だからです。

このシナリオでセキュリティ対策を実装するための提案はありますか?

答えて

4

少なくともIE式とFF -moz-bindingプロパティをフィルタリングする必要があります...両方ともCSSを使用して(潜在的に悪意のある)javascriptを実行するために使用できます。

This cheat sheetには、CSSを含む最も明白なXSS戦術が含まれています。

最も安全な解決策は、あなたが提案したように(ホワイトリストに登録されたプロパティのみを使用するようにユーザーを制限することが許容される場合)、おそらくホワイトリストになります。

+0

あなたはそれについてもっと詳しく教えてもらえますか?ありがとう! – Marcel

+0

http://tinyurl.com/cru7rj – kkyy

+0

を参照してください。ありがとうございました。 – Marcel

-1

CDATAを使用し、終了シーケンス(]]>)をエスケープします。しかし、ブラウザの互換性についてはわかりません。

例(未テスト):

<?PHP 

function strReplaceAll($needle, $replacement, $haystack) 
{ 
    // Check for infinite loop. (NOT FOOL PROOF!) 
    if(strpos($replacement, $needle) === FALSE) 
     return; 

    $numReplacements = 42; 

    while($numReplacements) 
    { 
     $haystack = str_replace($needle, $replacement, $haystack, &$numReplacements); 
    } 

    return $haystack; 
} 

?> 

<style type="text/css"> 
/* 
<![CDATA[ 
*/ 

<?PHP echo sstrReplaceAll(']]>', '', $userCss); ?> 

/* 
]]> 
*/ 
</style> 
+0

悪意のあるユーザーが「/ *]]> */malicious.stuff/* <![CDATA [*/"として$ userCss]のような文字列を持つ可能性があります。それはそれを回避する方法かもしれない。 – Marcel

+0

@マルセル、もちろんフィルタリングされています。 str_replaceを参照してください。 – strager

+0

ユーザーは、次のように入力することで簡単にその保護を回避できます。]]]]] >> – Nicholas

1

私は&lt;にすべて<の文字を置き換えるフィルタを実装しました。その理由は、CSSには<文字は必要ないからです。必要な唯一の文字は子セレクタに使用される>です。

このようにして、ユーザーは悪質なコードを書くためにタグを開くことはできません。

私は他の/より良い解決策を検討することができます。

1

CSSファイルをアップロードできないようにするには、ユーザーが選択したオプションに基づいて動的にCSSファイルを生成するインターフェイスを作成します。あなたが許可するオプション。あなたは擬似的なCSSファイルを作ることができます。あるいは、あなたはその設定に基づいてCSSを書く動的なアプリケーションを作ることができます。これはサーバ上にたくさんのCSSファイルを持っていません...その別のアプローチでは、 CSSを解析し危険なコードを拒否するよりも、許されるものをより簡単に定義することができます。

関連する問題