【8つの攻撃手法別】PHPのセキュリティ対策方法を解説!対策の重要性とは

PHPを使う際にセキュリティが重要になる理由とは?

PHPは簡単な文法で比較的安易に記述ができるプログラミング言語です。PHPを活用したECサイトなどで営利活動している企業も数多く存在しており、機能性も十分なのも人気の理由です。

一方、 PHPには脆弱性という側面がありセキュリティが必ずと言っていいほど問題になっています。それは一体何故なのでしょうか?下記にて、PHPとセキュリティの関係性について、もう少し詳しく見ていきましょう。

不正アクセスのターゲットになってしまう

PHPは簡単にWebを実装することができるのが強みですが、不完全なソースコードでも動作してしまうことがよく指摘されています。そのため、セキュリティホールが出やすい環境にあっても気づかない場合が散見されています。

バージョンもアップデートしないと、最新のプログラムが適用されないので、セキュリティホールを生み出す要因となってしまいます。PHPを安全に運営するにはタイムリーな更新も大切になります。

様々な業務で使われている

PHPのユーザーの幅は観光・小売はもちろん、BtoBの企業にも多く、広く業務を横断しているのが特徴です。

世界中のWEBサイトの約37%はWordPressで公開されているというデータもあり、いかにPHPが世界的シェアを有しているかを物語っています。

そして多くのPHPのサイトが存在している以上、脆弱性を有するサイトを見つけやすいので、攻撃者はPHPを狙い撃ちしやすいという弊害があります。

PHPを使う仕事の種類4つ

PHPが様々な業務で活用されているプログラミング言語である理由は、サーバーサイドのプログラミング言語で、ブラウザの影響を受けない点が挙げられます。

どんな環境からでもリリースできるため、ハードルが低く、個人のみならず多くの企業がPHPを採用しています。

また、PHPは動的なWebを作成するには重宝するプログラミング言語という特徴もあります。以下で具体的に確認していきましょう。

PHPを使う仕事の種類1:ECサイトの開発

ECサイト開発は小売業にとっては、販路拡張には重要なポイントになっていますが、PHPで作られているケースが多く存在しています。

PHPであれば、制作コストを圧縮することができ、カスタマイズがしやすいと言ったメリットがあります。WordPressを活用して独自のECサイトを構築できます。

WordPressであれば、ショッピングカート、決済システムはもちろん、売上や顧客情報を管理する機能を持たせられます。

PHPを使う仕事の種類2:Web開発

PHPはWebアプリケーションでも機能を発揮します。「ぐるなび」「一休.com」などもPHPを使ったアプリケーション開発として有名です。

PHPでWebアプリを作るにはさまざまなケースがありますが、HTMLとCSSを軸として、動的な部分にPHPを採用する方法も代表的なパターンの1つです。

Cakeなどのオープンソースのフレームワークのツールも多く存在しているので、積極的な活用が作業を効率化させます。

PHPを使う仕事の種類3:ゲーム開発

ゲーム開発の市場においてPHPは高い需要で、Web上で多くの求人情報を目にします。PHPには動的なサイトを作る上で必要なスクリプトという処理を扱うことに長けているからです。

このスクリプトの処理は、見るタイミングで画面を変えたり、ボタンを押すことで何らかの処理がなされたりする「動き」をもたらします。

ゲーム開発者を目指す場合は、PHPの知識は必須と言っても過言ではないでしょう。

PHPを使う仕事の種類4:業務システム開発

業務システム開発と言ったら有名なJavaやRubyですが、PHPも社内インフラで大きな役割を担っている言語です。

PHPはインタプリタ言語の側面があり、ソースコードをマシン語に変換するので、スムーズでスピーディな処理を実現させてくれます。

PHPを使う業務システム開発の具体例としては勤怠管理機能や、顧客管理システム、人事評価システムなど多岐に渡っています。

【攻撃手法別】PHPのセキュリティ対策方法8つ

攻撃手法別にPHPのセキュリティ対策方法を8つご紹介します。これからPHPで開発を考えている方や、導入されている方はぜひ参考にしてみてください。

セキュリティ対策方法1:クロスサイトリクエストフォージェリ

クロスサイトリクエストフォージェリとはWebの脆弱性につけこんだ悪意のある攻撃ことです。

悪意のある第三者が自ら設けた送信フォームにユーザーがアクセスしてしまうと、ポイントなど、ユーザーだけに付与された財物が第三者に送信されてしまいます。

では、クロスサイトリクエストフォージェリに対するセキュリティ対策方法はどんなものかを以下で確認していきましょう。

対策方法

クロスサイトリクエストフォージェリへのセキュリティ対策方法はワンタイムトークンが効果的です。ワンタイムトークンとはランダムな文字列のことです。

投稿フォームのページの表示前にトークンを生成します。セッションで保存されたトークンと送信フォームで埋め込んだトークンが一致するかどうかで、リクエストが不正かどうかを確かめることができます。

以下のPHPのコードで具体的に確認していきましょう。

コード記入例

クロスサイトリクエストフォージェリへの具体的なセキュリティ対策方法をPHPで書いてみましょう。投稿フォームのページの表示前にランダムな文字列であるトークンを下記のように記述します。

// ランダムな文字列を生成してセッションに設定
$csrf_token = ランダムな文字列;
$_SESSION[‘csrf_token’] = $csrf_token;

セキュリティ対策方法2:クロスサイト・スクリプティング

クロスサイト・スプリプティングはスクリプトをブラウザ上に発生させて、ユーザーの情報を盗んだり、システムに様々な障害を生じさせたりする手口のことを指します。

クロスサイト・スプリプティング(以下XSS)はユーザーのCookieを盗みとったり、セッションハイジャックを行ったり、場合によってはWebサイトを改ざんできたりするので要注意です。

では、XSSに対する対策方法はどんなものかを以下で確認していきましょう。

対策方法

XSSのセキュリティ対策方法はエスケープ処理という手法が効果的です。エスケープ処理は言語の文字列を扱う際、特別な意味を持つ文字や記号を別の文字列に置き換える方法です。

「htmlspeialchars」というPHPの関数を使ってENT_QUOTESを指定していきます。以下のPHPのコードで具体的に確認していきましょう。

コード記入例

function h($s) {
return htmlspecialchars($s, ENT_QUOTES, “UTF-8”);
}

上記のように記述することで、スクリプトとして表示されず、文字として出力されるようになります。

セキュリティ対策方法3:OSコマンド・インジェクション

OSコマンド・インジェクションはユーザーからの操作やユーザーへの表示を司るOSを構成するシェルを狙った攻撃になります。

ユーザーへブラウザを表示させるためには、PHPプログラムから外部のプログラムであるシェルに文字列を送る必要がありますが、その際外部からコマンド文字列を紛れ込ませると、コンピューターが侵害を受けてしまいます。

近年、これによる大量の顧客情報の漏洩に繋がった事件がニュースにもなりました。

対策方法

OSコマンド・インジェクションに対するセキュリティ対策は外部プログラムを実行しないことが一番効率的です。どうしても実行しなければならない場合は、実行コードに対して慎重に実装しなければなりません。

では具体的にどんな実行コードになるのか、以下で確認していきましょう。

コード記入例

OSコマンド・インジェクションの対策としての実行コードは下記になります。

exec(), passthru(), proc_open(), shell_exec(), system()

シェルを動かしてしまうAPIがOSコマンド・インジェクションにつながりますので、使用を控えることが得策になります。

どうしても外部プログラムの実行が避けられない場合は、シェルが用いられない関数を利用することで回避しましょう。

セキュリティ対策方法4:ディレクトリ・トラバーサル

ディレクトリ・トラバーサルはユーザーが意図しないファイルにアクセスされることで、ユーザー固有の情報が盗まれることを指します。ファイルを階層で位置づけるディレクトリを遡る攻撃特性があります。

WordPressなどのCMSの性質が発生原因になっています。CMSは拡張機能が豊富ではありますが、脆弱性を有しているため、外部プログラムからの攻撃に弱い特徴があります。

対策方法

ディレクトリ・トラバーサルのセキュリティ対策方法は、ファイル名にディレクトリ名が含まれないようにすることが根本的解決になります。また、ファイル名を直接指定するような実装の仕方を避けることも大切です。

では具体的にどんな実行コードになるのか、以下で確認していきましょう。

コード記入例

ディレクトリ・トラバーサルのセキュリティ対策の実行コードは下記をご覧ください。

echo basename(‘/home/example/www/file.txt’);

basename関数を利用した記述にすればファイル名のみを取得することができるため、遡り攻撃を回避することができます。

セキュリティ対策方法5:HTTPヘッダー・インジェクション

WEBアプリケーションの中には、HTTPヘッダーの情報をブラウザからのリクエストを基に作成するものがあります。

HTTPヘッダー・インジェクションは細工した情報をHTTPヘッダーに注入(インジェクション)することを指し、偽ページなどが表示されます。

偽ページにユーザーがアクセスすることで、ユーザーの個人情報などを悪意のある攻撃者に送ってしまう結果となり、大切な情報が盗まれてしまいます。

対策方法

HTTPヘッダー・インジェクションのセキュリティ対策方法としては、HTTPヘッダーを生成する際はXSS同様エスケープ処理をすることが効果的です。「htmlspecialchars」のPHP関数を用いて回避しましょう。

では具体的にどんな実行コードになるのか、以下で確認していきましょう。

コード記入例

HTTPヘッダー・インジェクションのセキュリティ対策方法としては、文字列を以下のように記述をすれば簡単に回避できます。

htmlspecialchars($str, ENT_QUOTES, ‘UTF-8′);

あとは$strの部分にリクエストボディに設定した文字列を設定するだけです。

セキュリティ対策方法6:メールヘッダー・インジェクション

メールヘッダー・インジェクションは「お問い合わせフォーム」や「アンケート」などの専用フォームなどで、悪意のある攻撃者がメールヘッダーを改ざんし送信することで、攻撃者が指定した先にメールが届くことを指します。

メールヘッダー・インジェクションによって、ユーザーは意図しない内容のメールを受け取ってしまったり、アプリケーションに意図しない動作をさせたりすることにつながります。

対策方法

メールヘッダー・インジェクションのセキュリティ対策方法としては、メールヘッダーを固定することが挙げられます。メールヘッダーの本文のみ入力させて、外部からの入力をシャットアウトさせるようにします。

また、外部からの入力値の改行コードを削除することで、メールヘッダーの改ざんを防ぐことができます。下記にて確認していきましょう。

コード記入例

メールヘッダー・インジェクションのセキュリティ対策方法の具体例としては、お問い合わせフォームに下記の文字を打ち込んだ場合を考えてみます。

メールのタイトルです%0d%0aBcc%3a%20△△@△△△.△△

「%0d%0a」が改行コードになり、「%0d%0a」を削除することで、BCCが追加されることはありません。

セキュリティ対策方法7:セッション・ハイジャック

セッション・ハイジャックはセッションが乗っ取られることを意味します。セッションが乗っ取られることにより、ユーザーの個人情報が盗まれてしまうことにつながります。

原因は何らかの手段でセッションIDが盗まれてしまうことで起こります。セッションIDがあれば、元のIDの持ち主になりすますことができるのです。

対策方法

対策方法としては、Cookieの見える化を無くすことが必要です。具体的には、HTTPS通信時のCookieにsecure属性を付与したり、セッションIDをURLに含めなくしたり、初期設定の「PHPSESSID」のセッション名を変更することが大切です。

また、推測困難なセッションIDを生成するようにしたり、設定したセッションIDは受け付けない、アクセス毎にセッションIDを変更したりする方法が有効です。

コード記入例

session.use_strict_mode = 1
初期化したセッションIDしか受け付けないコードですが、mode=0の値だと、ユーザーが適当に生成した値がセッションIDとなるので要注意です。

session_start();
session_regenerate_id(true);

セッションの固定攻撃を防ぐのが、セッションIDをアクセス毎に変更できるession_regenerate_id関数です。

セキュリティ対策方法8:クリックジャッキング

クリックジャッキングとはボタンやリンクなど、設置しているページを透明表示機能によって見えなくし、本ページの上から被せる手口を指します。

クリックジャッキングをすることで、クリックした覚えがない悪意のあるサイトにアクセスしてしまいます。ユーザーに思わぬ損害を被らせてしまうことがあるので対策が必要です。

対策方法

クリックジャッキングのセキュリティ対策方法はフレームでのページの読み込みを禁止するコードを設定することで回避が可能となります。基本的にX-FRAME-OPTIONSヘッダーを記述する必要があります。

では具体的にどんな実行コードになるのか、以下で確認していきましょう。

コード記入例

Header set X-FRAME-OPTIONS “DENY”

アパッチの.htaccessに上記を記述をすれば、スクリプト毎に設定するという手間が省けます。

DENYはフレームでのページの読み込みの一切を禁止していますが、「SAMEORIGIN」や「ALLOW-FROM」という限定的にページの読み込みを許可するワードもあります。原則DENYでどうしてもページの読み込みが必要な場合にご参照ください。

PHPのセキュリティを学べる本

PHPのセキュリティ対策として、書籍を持っておくと、いざという時に慌てずに済みます。そこでお勧めしたい書籍は「体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践」です。

脆弱性が生まれる原因から丁寧に解説しており、攻撃と防御のカラクリを体系的に学習できます。PHPサンプルへの攻撃を通じた解説なので、PHPのセキュリティ対策にはうってつけです。価格は5,320円です。

いざというときのために、自分がわかりやすいと思う1冊を所有することをおすすめします。

PHPのセキュリティ対策をしっかりと行おう!

PHPは攻撃に脆弱な特性があるため、セキュリティ対策も多岐に渡り注意が必要です。しかし、PHPのセキュリティ対策は有料ではなく、最低限の記述をすれば解決できるものが多いです。

それぞれのサーバー攻撃に対応したPHP関数を入れることで解決する場合も多いので、対策をチェックすれば安全な運営につながります。

今後も新たな攻撃が生まれる可能性があるので、予めリスク回避のための知識を有しておくことが大切です。