2009-11-09 13 views
5

私はURLを受け入れるフォームテキストフィールドを持っています。フォームが提出されると、私はこのフィールドを適切なanti-sql-injectionとともにデータベースに挿入します。私の質問はxssについてです。入力はURLです、それをxssから守る方法

この入力フィールドはURLで、ページに再度表示する必要があります。どのように私はデータベースへの途中でxssから保護する(私はすでにSQLインジェクションの世話をして以来、何も必要ではないと思う)のうちデータベースから?

私たちはこのようなふりをしましょう。私はそれを単純化しています.SQL注入について心配しないでください。後はどこから行くの? 、<、&(これは(そのよう<body></body>または<div></div>間など)HTMLコンテンツに入れることになるだろう、あなたは5つの特殊なXML文字をエンコードする必要があると仮定すると、

$url = $_POST['url']; 

おかげ

+1

SQL注入を避けるには、準備された文を使用してください。 http://php.net/manual/en/pdo.prepared-statements.php –

答えて

9

>、」、「)、およびOWASPは、スラッシュ(/)だけでなく、PHPの組み込みなど、推奨しています、htmlentities()はあなたのための最初の部分を行います、と簡単なstr_replace()がスラッシュを行うことができます。

function makeHTMLSafe($string) { 
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8'); 
    $string = str_replace('/', '&#x2F;', $string); 
    return $string; 
} 

しかし<ahref=節のように汚染された値をHTML属性に入れる場合は、別の文字セット([space]%* +)をエンコードする必要があります。 、 - /; < => ^および|) - とあなたは二重引用符あなたのHTML属性をする必要があります。

function makeHTMLAttributeSafe($string) { 
    $scaryCharacters = array(32, 37, 42, 43, 44, 45, 47, 59, 60, 61, 62, 94, 124); 
    $translationTable = array(); 
    foreach ($scaryCharacters as $num) { 
     $hex = str_pad(dechex($num), 2, '0', STR_PAD_LEFT); 
     $translationTable[chr($num)] = '&#x' . $hex . ';'; 
    } 

    $string = strtr($string, $translationTable); 
    return $string; 
} 

最終懸念が違法なUTF-8で文字-一部のブラウザに配信、病気に形成されたUTF-8バイトのシーケンスHTMLエンティティから抜け出すことができます。その正規表現に

function assertValidUTF8($string) { 
    if (strlen($string) AND !preg_match('/^.{1}/us', $string)) { 
     die; 
    } 

    return $string; 
} 

u修飾子は、Unicodeのマッチングの正規表現ます:。これを防ぐために、単にあなたが得るすべてのUTF-8文字が有効であることを確認単一のchararchter、.を照合することによって、文字列全体が有効なUnicodeであることが保証されます。

これはすべてコンテキスト依存であるため、出力をユーザーに提示する直前に、できるだけ早くこのエンコーディングを実行することをお勧めします。このプラクティスに参加することで、あなたが逃した場所を簡単に見ることができます。

OWASPは、XSS prevention cheat sheetに関する多くの情報を提供します。

+0

html属性、contra text要素を使用する際の特別な予防措置について聞いたことはありません。それについての参考/説明がありますか? – troelskn

+2

ああ私の質問に答えるために、OWASPは属性が引用されていなければ*これが推奨されています*。代わりに属性を引用することをおすすめします。 – troelskn

+0

HTML属性に含める文字をエンコードする場合、OWASPは "引用符で囲まれていない属性は、** [space]%* +、 - /; < = > ^と|を含む多くの文字で区切ることができます。 。だから、これらをエンコードするだけでは十分ではないでしょうか? – Lode

1

ユーザに表示する前に、htmlspecialcharsでエンコードする必要があります。通常これは、<スクリプト>タグおよび/またはHTMLタグ属性以外のデータを扱う場合には十分です。

1

あなた自身のXSS保護をロールしないでください。余分なものがあります(私は特定のXSSデモページへのリンクをもう見つけられませんが、可能性の程度は驚異的です)。壊れたIMG-タグ、奇妙な属性など)。

sseq-libのような既存のライブラリを使用するか、または既存のフレームワークから1つを抽出します。

更新:ここはthe XSS-demopageです。

関連する問題