攻撃と被害の流れ / クロスサイトスクリプティング処理を実行するタイミング / 対策は3種類

PHP用語集

カテゴリー: セキュリティ  閲覧数:788 配信日:2014-05-21 23:05


攻撃と被害の流れ


1.攻撃
・XSSの脆弱性があるページに、悪い人がスクリプト(多くの場合Javascript)を埋め込む

2.被害
・そのページを開いたユーザが攻撃を受けてしまう

クロスサイトスクリプティング処理を実行するタイミング


入力で処理しても良い?

・エスケープ処理のタイミングは入力データのチェック時ではなく、HTMLの生成時(出力時)に行うべき
・いろんな入力源から入り込んでくるデータを漏れなくエスケープ処理できるから

小さなプログラム
・どちらでも良い
・数行程度のプログラムなら、入力直後で処理するのも、HTML出力の直前で処理するのも同じこと

大規模プログラム
・入力から出力までのデータフローは長くて複雑なパス(道のり)を構成
・真ん中あたりで処理するのは最悪
・処理されているかいないかの確認が難しくなるから

・入力直後か出力直前

入力直後のエスケープ処理が良くない理由
・入力時点では値の目的が不明
・「<」を「&lt;」に変換する必要があるのは、その値がHTML出力で使われるという理由から
・その入力値が、もしSQL文の一部として使われるならば、SQLインジェクション対策をしなくてはならない。具体的には「'」の文字を処理
・SQL文にも使われるしHTML出力にも使われるなら、両方処理する必要がある
・入力直後でサニタイズすると、両方処置した値がHTML出力に使われたとき、無駄に「'」がエスケープされて「''」とか「\'」と表示されてしまうという、マヌケなことが起きる

・「外部からの入力に依存していない値については(セキュリティ上問題ないので)エスケープを省略する」という発想は、利益がない(いまどきそんな省略で性能に変化が出ることはない)ばかりか、メンテナンス性を悪くし、脆弱性の原因となります。

・クロスサイトスクリプティング脆弱性を排除するには、HTML文字列を書き出す部分で、「<」などを「&lt;」などに変換(エスケープ処理)すればよい

対策は3種類


1.HTMLエスケープ
2.URL属性部分の対応
3.イベントハンドラ属性の対応

週間人気ページランキング / 7-17 → 7-23
順位 ページタイトル抜粋 アクセス数
1 PHP用語 6
2 コンストラクタ デストラクタ | クラスとオブジェクト 4
2 マジックメソッド(クラスとオブジェクト) カテゴリー 4
3 ログイン 3
4 Parse error: syntax error, unexpected $end in ○○.php on line △△ | Parse error(エラーメッセージ) 2
4 PHPでcurlを使用するためには?/ 2.オプション設定 / curlでPOST送信 2
4 You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. | Twitter API(エラーメッセージ) 2
4 htmlspecialchars / htmlentities / addslashes / mysql_real_escape_string / mysqli_real_escape_string | セキュリティ 2
4 デフォルト引数 | 関数 2
4 Fatal error: Uncaught Error: Class 'Mecab_Tagger' not found in /var/www/★★.php:☆☆ | Fatal error(エラーメッセージ) 2
4 遭遇例1.存在する間違ったデータベース名を指定 2
4 リファレンス基本操作は3通り 2
5 __setメソッド | マジックメソッド(クラスとオブジェクト) 1
5 P … 子クラスインスタンス生成。親クラス内での$this 1
5 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 1
5 Fatal error: Uncaught Wrench\Exception\HandshakeException: No accept header receieved on handshake response in ★★★ headless-chromium-php/vendor/wrench/wrench/lib/Wrench/Protocol/Protocol.php | エラーメッセージ 1
5 対応案B.文字列処理ではなく、配列処理を実施 1
5 PHPでどうしてもエラーが画面表示されない時は、HTMLコメントアウトを外してみる | エラーメッセージ 1
5 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 1
5 PECLとは? 1
2026/7/24 5:05 更新
指定期間人気ページランキング / 2020-5-28 → 2026-7-23
順位 ページタイトル抜粋 アクセス数
1 PHP用語 7335
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2561
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 2522
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 1718
5 【テスト投稿】テスト | 1133
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1091
7 PHPで定数を定義する方法は2種類ある / 配列定数の定義 1077
8 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 917
9 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 886
10 コード例 … 「例外処理」はネストすることができる 875
11 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 872
12 curl で Cookie を使用する 869
13 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 757
14 定数 748
15 インターフェイス | クラスとオブジェクト 706
16 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 699
17 メンバー | クラスとオブジェクト 650
18 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 649
19 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column | Fatal error(エラーメッセージ) 614
19 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 614
2026/7/24 5:05 更新