2017-08-08 9 views
0

これまでに尋ねられたことがお詫び申し上げますが、この場合、あまりにも過小ではなく、そこに情報の過負荷があると感じています。私が見ているところには矛盾する意見があるようです。 説明があれば幸いです。XSSを防ぐために、HTML形式でユーザー入力をhtmlspecialchars()する必要がありますか?

私はユーザー登録フォームを持っています。私はさまざまなフィールドを検証しましたが、私はhereを読んで出力(ユーザープロファイルなど)を残すことをお勧めしていますので、データ(例:htmlspecialchars)にサニタイズ機能を使用していません。私はデータを挿入するためにPDO準備文を使用していますので、私が知る限り安全です。

しかし、私のドメインをさまざまな脆弱性スキャナーで実行していると、登録フォームが非常に危険であり、XSS攻撃の犠牲になる可能性があると報告しました。修正後に再提出するように、彼らは、別のフィールドにエラーが発生している

<input type="text" placeholder="Username" name="user" maxlength="32" value="<?php echo test_input($user); ?>" pattern="^[a-zA-Z0-9]*$" required> 

私は場合には、フォームに戻って、そのユーザーの入力をエコー-INGの午前:私は次のようにこれが原因となったコードのスニペットを考えています。したがって、潜在的に有害なスクリプトがページにエコーされる可能性があります。

ただし、確かにこれは特定のユーザーからの入力だけですか?彼らが引き起こす可能性のある唯一の害は自分自身です。スキャナが間違っているのですか、または私はほとんどそのリスクに気づいていませんか?

一般的な文字列、電子メールアドレス、URLのフィールドがあります。私のサイトへの訪問者の安全を確保するために、どのような措置を取る必要がありますか?

ご協力いただきありがとうございます。私に教えてください。

EDIT

function test_input($data) 
    { 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data, ENT_QUOTES | ENT_HTML5, 'UTF-8'); 
    return $data; 
    } 
+0

'test_input()'は何をしますか? –

+0

申し訳ありませんが、危険なスクリプトが実行されないようにするために追加した機能です。元の投稿に追加します。基本的に私の質問は、この段階で必要かどうか、またはユーザーが入力した内容を正確に返すだけなのかどうかです。それを指摘してくれてありがとう。 – user2228716

+0

[大脱走(または:テキスト内でテキストを扱うために知る必要があるもの)] – deceze

答えて

0

は、私はXSSを防ぐために、HTML形式ではhtmlspecialcharsに()ユーザの入力が必要ですか?

何かが必要です。 htmlspecialcharsは一般的には良い選択です。これは単純で入力を破壊しません。

ただし、確かにこれは特定のユーザーからの入力ですか?

これは、特定のユーザーのブラウザからの入力です。

そのユーザーは、サイトのフォームに入力のデフォルト値としてXSS攻撃を加える悪意のある第三者サイトにアクセスした可能性があります。次に、フォームのactionをサイトのに設定しました。その後、JSでフォームを送信します。

結果:コードはユーザーのブラウザによってサイトに挿入され、JSはサイト上で実行されます(ユーザーのCookieおよびセッションにアクセスできる)。

+0

これは完璧な意味合いがあります。どうもありがとうございます。元のユーザー入力をデータベースに提出することができます(出力時にhtmlspecialcharsを指定します)。ただし、ユーザー入力をエコーし​​て訂正のためにフォームに戻すと、指定されたシナリオでhtmlspecialcharsする必要があります。 – user2228716

0

変数を別のコンテキストに挿入するときは、それらが壊れていないことを確認して親要素に追加の属性を追加するために、htmlspecialchars()(または上記のnoHTML())を介して変数を実行する必要があります。

これは安全です:

<input type="text" name="username" value="<?php echo noHTML($htmlp->purify($_GET['username'])); ?>" /> 

この、あまりにも、XSS攻撃に対して安全であるが、それでも悪いアイデア:結局のところ

<?php echo $htmlp->purify("<input type=\"text\" name=\"username\" value=\"".$_GET['username']."\" />"); ?> 

、コンテキストがクロスを防止するために多くの重要サイトスクリプティング攻撃あるコンテキストで安全なもの(HTMLなどが許可されているもの)は、他のコンテキストでは悲惨なものになる可能性があります(たとえば、HTML属性の途中です)。

完全なソース:https://paragonie.com/blog/2015/06/preventing-xss-vulnerabilities-in-php-everything-you-need-know

+0

これは素晴らしいソースです、ありがとうございます。セキュリティのためにENT_QUOTESを使用することに同意しますが、自分のフィールドの一重引用符( ')を許可する場合はどうすればよいですか?それ以外の場合、「XSS攻撃が気に入らない」とは、「I don ' XSSのように」出力されますか? – user2228716

+0

引用符をバックスラッシュでエスケープすることができます。 "" XSS攻撃が好きではありません。あなたが私の答えが有用であれば、それをアップヴォートにしてください:) –

-1

値が永続化されていないと、彼らは、コードを提出する場合にも注入し、XSS攻撃するので、私は、あなたがいない、多くのリスクが存在しない、記載された正確なシナリオに言うつもりですそれは自分の見解だけに影響します。
しかし、エンコードされていない値をユーザーに出力するのは良い方法ではありません。そして、ページが後で変更された場合、または値が永続化され、後で何らかの管理ページでエンコードされずに表示される場合はどうなりますか?彼らはあなたのサイトにXSS攻撃を注入することができました。 ユーザが入力した値を表示する前に、常にエンコードすることをお勧めします。

+0

意味がある、助けてくれてありがとう! – user2228716

関連する問題