メインコンテンツへスキップ
見出し画像

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 #クロスサイトスクリプティング #セキュリティ #脆弱性対策 #社内標準 #制作会社経営 #中小企業 #コードレビュー #品質管理

     
     
    Web制作・開発会社の「労働集約という病」をAIで冷徹に切除し、利益率を極限化する組織ハッキング術を公開。 人間の感情と作業を排除し、社長一人で莫大な富を搾取する「完全無人ファクトリー」を構築する覚悟を持つ経営者のみ、有料記事で圧倒的な暴利と勝利を手に入れてください。

    あなたへのおすすめ