セキュリティを高める

SPIRALを用いることで安全性の高いWebアプリケーションを構築することができますが、PHP等による拡張開発の方法次第では、セキュリティを低下させる恐れがあります。

SPIRALのアプリ開発で注意すべき点を説明します。

インジェクション対策

DBやパラメータの値はサニタイズしてから表示

以下はマイエリアのカスタムマイページ、または一覧表・単票の単票ページのHTMLコードの例です。

・・・ 中略 ・・・
<body>
<p>お問い合わせ番号: <div id="telephone" style="font-size: 150%; color: red;">03-3456-7890</div></p>
<hr><p>コメント:
<?php echo $SPIRAL->getContextByFieldTitle("remarks"); ?>
</p></body>
</html>

(出力例1)

スクリーンショット 2014-02-14 15.21.01

もしDBに不正なデータが登録されると、スクリプティングできてしまいます。

スクリーンショット 2014-02-14 15.29.08

(出力例2)電話番号が不正に変更されて表示されています

スクリーンショット 2014-02-14 15.21.12

スクリプティングを防ぐために、サニタイズして出力します。

・・・ 中略 ・・・
<body>
<p>お問い合わせ番号: <div id="telephone" style="font-size: 150%; 
color: red;">03-3456-7890</div></p>
<hr><p>コメント:
<?php echo htmlentities($SPIRAL->getContextByFieldTitle("remarks")); ?></p></body>
</html>

(出力例3)不正なデータを無害化しています

スクリーンショット 2014-02-14 15.21.28

なりすましを防ぐ

なりすまし更新・削除を認証キーにより防ぐ

フォームの設定で、推測しやすいユーザIDのみを更新のキーとしている場合、他人になりすました情報更新ができてしまいます。

(DB例1)employee_idを主キーとして持っています。この例では、employee_idはアルファベットローマ字で姓・名を.(ドット)で繋いだものを使用しています。

スクリーンショット 2014-02-14 16.16.12

(更新フォーム例1)識別キーにemployee_idを設定しています。

スクリーンショット 2014-02-14 16.17.43

「山田 太郎」さんが、このフォームのHTMLファイルをダウンロードし、

   ・・・ 中略 ・・・
<form method="post" action="https://www.pi-pe.co.jp/regist/Reg2">
    ・・・ 中略 ・・・
<input type="password" name="password" value="hogehoge" size="16" maxlength="16"><br>
    ・・・ 中略 ・・・
<input type="hidden" name="SMPFORM" value="mdk-nalcr-731a7fc2742c96b7b32b3dfd178cddc1">
<input type="hidden" name="employee_id" value="yamada.taro">
<input type="submit" name="submit" value="送信">  <input type="reset" value="リセット">

さらに、更新のキーを推測して「yamada.taro」から「suzuki.hanako」に書き換えた場合

   ・・・ 中略 ・・・
<input type="hidden" name="employee_id" value="suzuki.hanako">
<input type="submit" name="submit" value="送信">  <input type="reset" value="リセット">

上記の例の場合、「山田 太郎」さんが「鈴木 花子」さんの情報を更新できてしまいます。

なりすましを防ぐために、推測できない認証キーを使い、セキュリティを高めます。認証キーは、フォーム管理のセキュリティ機能です。識別キー(ID)で更新レコードを特定するとともに認証キーの一致を確認して、更新の正当性を認証します。

  1. 認証キーフィールドをDBに持たせる(フィールドタイプは、簡易パスワード、数字・記号・アルファベット(32 bytes)、整数のいずれかで作成する)
  2. 認証キーフィールドにフィールド値自動生成トリガを設定する(ランダム値)
  3. フォーム管理で認証キーフィールドを「値を引継ぐ(hidden)」に設定する
  4. フォーム管理で認証キーフィールドを「認証キー」に設定する
自動生成トリガは、DBへの登録(INSERT)でのみ動作します。DBに登録済のレコードに追加することはできませんので注意してください。

(DB例2)認証キーフィールドcertkeyに、ランダム値”1119668039″が登録されています。

スクリーンショット 2014-02-14 17.37.32

(更新フォーム例2)フォームに、認証キーフィールドcertkeyのinputタグが挿入されています。

   ・・・ 中略 ・・・
<input type="hidden" name="employee_id" value="yamada.taro">
<input type="hidden" name="certkey" value="1119668039">
<input type="submit" name="submit" value="送信">  <input type="reset" value="リセット">

不正な経路からの登録・更新を防ぐ

一般公開フォームの場合(セキュリティキーを利用する)

フォーム管理のセキュリティ機能を使用して、クロスサイトリクエストフォージェリの対策をします。

(フォームへの不正投稿の例)

img1

確認フォームに一時的な(制限時間のある)セキュリティキーを使うことで、不正登録を防ぎます。

  1. フォーム管理で、セキュリティレベルの設定「不正経路からの登録防止」を制限するに変更する。(新規作成したフォームは、あらかじめ「制限する」になっています)

「制限する」に設定すると、フォームの確認ページでセキュリティキーが生成され、登録時にキーの正当性が確認されます。

(セキュリティキーによる正当性の確認の例)

img2

マイエリア内フォームの場合(セッションを利用する)

マイエリア内にあるフォームでも、標準のままでは、マイエリア外からの登録・変更・削除が可能です。

(フォームへの不正投稿の例)

スクリーンショット 2014-02-18 18.39.59

フォーム管理のセキュリティ機能「マイエリア認証によるアクセス制限」を設定することで、マイエリア外からの登録・更新を防ぎます。

  1. フォーム管理で、セキュリティレベルの設定「マイエリア認証によるアクセス制限」を制限するに変更する。(新規作成したフォームは、はじめは「制限しない」になっています)

「制限する」に設定すると、フォームの送信時にセッションの正当性が確認されます。

(セッション正当性の確認の例)

スクリーンショット 2014-02-18 19.09.27