
XSS対策を「入力チェックをしているから大丈夫」で済ませていないか──出力時のエスケープを社内標準にし、CMS改修と外部タグまで含めて説明できる制作会社になる
この記事は、XSS対策(クロスサイト・スクリプティング対策)を、制作会社の社内標準とレビューの型にする方法を扱います。
「入力欄で記号をはじいているので大丈夫です」
XSS対策について聞かれると、こう答える制作会社があります。
入力のチェックは大切ですが、それだけでは対策の中心ではありません。
IPAの「安全なウェブサイトの作り方」は、入力値の内容チェックを「保険的対策」に分類しています。
根本的解決として最初に挙げているのは、ウェブページに出力するすべての要素にエスケープ処理を施すことです。
入口で止めるのではなく、出口で無害にする。
この順番を社内で取り違えていると、どれだけ丁寧に作っても、説明が食い違います。
XSS対策とは、外から来た文字を画面に出すとき、必ず「ただの文字」として表示されるように加工する作り方を、全員で守ることである
黒字化の外科医です。XSS対策を、制作会社の標準とレビューの仕組みとして解剖します。
社内標準にすべき理由は、三つあります。
第一に、XSSは「出力するすべての箇所」で起こり得るから。
問い合わせの確認画面、検索結果、管理画面の一覧、会員のプロフィール。外から来た文字を表示する箇所は、思った以上に多くあります。
一人の注意力ではなく、作り方の決まりで守る必要があります。
第二に、頻度が高い問題だから。
OWASP Top 10(2025年版)は、XSSを「Injection」(A05)に含め、「頻度は高いが影響は低い」ものとして説明しています。
影響が小さく見えても、顧客から見れば「脆弱性を指摘されたサイト」です。
第三に、制作会社の改修が、標準の外側になりやすいから。
テーマの改修、ランディングページの追加、外部のタグの差し込み。急ぎの小さな仕事ほど、レビューを通らずに本番へ出ます。
今すぐ試せる:自社の「出力のルール」を下書きするプロンプト
私はWeb制作会社の経営者です。XSS対策の社内標準を、A4で1枚に下書きしてください。
【前提】
・主に使う言語・テンプレートエンジン・CMS:〔 〕
・外から来た文字を表示する主な画面(確認画面、検索結果、管理画面など):〔 〕
・利用者にHTMLの入力を許す機能があるか:〔ある/ない〕
・小さな改修(テーマ修正、LP追加)の進め方:〔 〕
1. 「出力するときに必ずエスケープする」を軸に、守ることを5項目以内で書く。
2. テンプレートエンジンの自動エスケープを無効にする書き方を、例外として扱うルールを書く。
3. URLを出力する箇所、スクリプトの中に値を埋め込む箇所の扱いを書く。
4. 小さな改修でも通すレビューの手順を書く。
5. 顧客に説明する3行の文を書く。
攻撃の文字列や再現手順は書かないこと。参考はIPA「安全なウェブサイトの作り方」と、言語の公式マニュアルに限ること。XSS安全標準工場:出力のルール、レビュー、説明文
社内標準の型
【画面出力の社内標準】第〇版
1. 外から来た値を画面に出すときは、出力の直前で必ずエスケープする
(テンプレートエンジンの自動エスケープを使う。PHPで直接出す場合は
htmlspecialchars を、文字コードを指定して使う)
2. 自動エスケープを外す書き方は、原則禁止。使う場合は承認と記録
3. リンク先のURLを出すときは、http:// か https:// で始まるものだけを許可する
4. scriptの中身を、外から来た値で組み立てない
5. HTMLの入力を許す機能は、作る前に設計を相談する
6. Cookieには HttpOnly 属性を付ける(万一のときの被害を減らす)
7. レスポンスの Content-Type に文字コードを指定する1・3・4・7は、IPAが根本的解決として挙げている項目にあたります。
6はIPAの保険的対策にあたり、MDNも HttpOnly 属性はJavaScriptからCookieを読めなくし、XSSの被害を和らげると説明しています。
php.netの説明では、htmlspecialchars は、HTMLで特別な意味を持つ文字を実体参照に変換する関数です。PHP 8.1.0からは、既定でシングルクォートも変換する設定に変わりました。古い書き方を引き継いだコードは、引数の指定を確認してください。
納品前レビューの確認項目
□ 外から来た値を表示する画面を、一覧にしたか
□ 一覧のすべてで、出力時のエスケープが効いているか
□ 自動エスケープを外している箇所を、検索して洗い出したか
□ 外した箇所に、承認と理由の記録があるか
□ URLを出力する箇所で、許可するスキームを限定しているか
□ 管理画面(お客様の担当者が見る画面)も、同じ基準で確認したか
□ 外部のタグ(解析・広告・チャット)の一覧と、追加した人の記録があるか
□ レビューした人・日付・結果を残したか管理画面の一覧は、見落とされやすい場所です。お客様の担当者がログインして見る画面は、攻撃者から見ても価値のある画面です。
顧客への説明文(例)
本サイトでは、利用者が入力した内容を画面に表示する際、
IPA「安全なウェブサイトの作り方」の根本的解決にあたる処理
(出力時のエスケープ処理)を、当社の社内標準として実装しています。
今後、外部のタグを追加される場合は、事前にご相談ください。
タグの追加は、サイトの安全性に影響することがあります。外部のタグの扱いは、改ざん検知とあわせて保守で管理します。
▶ ウェブスキミングとは、顧客サイトの入力画面が気づかないまま盗み見られること──制作会社が保守で止める改ざん検知・外部スクリプト・管理画面の守り
構造的なリスク
逆説を指摘しておきます。
出力のルールを守っても、あとから入る外部のタグや、お客様が自分で入れるコードは、標準の外にあります。
納品時に安全でも、半年後には別のサイトになっていることがあります。
だから、標準は「納品時の品質」と「運用中の管理」を分けて書きます。後者は、外部タグの台帳と、セキュリティヘッダーの設定で守ります。
▶ セキュリティヘッダーを「診断ツールの点数」のために入れると、サイトが崩れる──主なヘッダーの意味、外部タグと表示崩れを避ける導入の順番、顧客への説明
よくあるQ&A
Q. 入力チェックは、やめてもよいのか?
やめる必要はありません。IPAも保険的対策として挙げています。ただし、入力チェックを「XSS対策の本体」として説明しないでください。
Q. CMSを使っていれば、自動で守られるのでは?
CMSやテンプレートエンジンの多くは、出力時のエスケープの仕組みを持っています。問題は、改修のときにその仕組みを外したり、使わずに出力したりすることです。改修の差分をレビューの対象にしてください。
Q. 古いサイトで、全部を確認する予算がない。
外から来た値を表示する画面の一覧を作り、ログインを伴う画面と、個人情報を扱う画面から優先します。一覧と優先順位を、そのまま改修の見積もりにします。
最後に
XSS対策の中心は、入口のチェックではなく、出口のエスケープです。
出力のルールを社内標準にし、小さな改修までレビューを通した会社だけが、「入力チェックをしています」ではなく「作り方が決まっています」と説明できるのです。
▶ CSRF対策を「フレームワークが勝手にやってくれる」で止めない──トークンの標準化、重要な操作の洗い出し、管理画面まで含めたレビューと顧客への説明の型
これまでの記事は、メンバーシップ「黒字化オペ室」でまとめて読めます。月額1,980円、記事2本分の金額です。詳しくはプロフィールから。
#Web制作会社 #XSS #クロスサイトスクリプティング #セキュリティ #脆弱性対策 #社内標準 #制作会社経営 #中小企業 #コードレビュー #品質管理