サーバー変数をページにエコーするときに、すべてのベースをセキュリティでカバーしましたか?
質問
常に使用してきたフォームで
<form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
フォームを自分自身に送信させる。
誰かがリンクする場合にstriptags()
を使用します:
http://www.mysite.com/page-with-form.php?bla="><script src="http://www.nasty.com/super-nasty.js"></script><a href="#
XSS攻撃から保護するためにすべてのベースをカバーしましたか?または、より多くのホワイトリストアプローチ、たとえば英数字、スラッシュ、疑問符、等号、括弧などのみを許可する正規表現を使用する必要がありますか?
ありがとう!
解決
htmlspecialchars
の代わりに strip_tags
を使用します。
他のヒント
同じスキーマ/ホスト/パスを参照する場合は、単純なアクション= <!> quot;?<!> quot;十分です。 http://tools.ietf.org/html/rfc3986#section-4.2
relative-ref = relative-part [ "?" query ] [ "#" fragment ] relative-part = "//" authority path-abempty / path-absolute / path-noscheme / path-empty
有効な相対URIです。
これに送信することにより、フォームを自分自身に送信します:
$_SERVER["PHP_SELF"]
そのグローバル変数は現在のページを出力します。理由がない限り、クエリ文字列全体を一緒に必要としますか?
編集
VolkerKのコメントで指摘されているように、PHP_SELF
でも脆弱であるため、<=>に基づいて独自の小さな変数を記述し、ページの一部ではないことがわかっているURIの残りを展開できます。 。このようなもの:
$file_ext = '.php'; //knowing what file extension your URI is
$page_on = $_SERVER["PHP_SELF"]; //grab this page, with all that junk
$page_huh = explode($file_ext, $page_on); //blow it apart based on file ext
$page_on = $page_huh[0].$file_ext; //attach the leg back onto the URI
echo $page_on;
striptags()
がタグ(<!> quot; <!> lt; <!> quot;と<!> quot; <!> gt; <!> quotの間の文字のみを削除する場合、山括弧を含む) 、誰かが引き続きJavaScriptを挿入できます:
http://www.mysite.com/page-with-form.php?bla=" onsubmit="return function(){ /*nasty code here*/ }()" style="
HTML、Javascript、CSSのすべての可能なメタ文字(つまり、山括弧、括弧、中括弧、セミコロン、二重引用符、単一引用符など)をホワイトリストに追加します。
フォームを自分自身に送信する場合は、アクションを空のままにします。例:
<form action="" method="POST">
...
</form>