現場でセキュリティ周りも見てきたエンジニアとしての回答です。
結論:そのままの状態で社内システムとして運用するのは危険です。
ただ、「全部やらないとダメ」ではなく、優先順位をつけて対策すれば現実的に運用できます。
最低限やるべきこと(優先度順)
- SQLエスケープ処理(最優先)
これだけは今すぐ対策してください。SQLインジェクションは最も被害が大きく、DB内のデータが全部抜かれます。PDOのプリペアドステートメントを使うだけで対策できます。
// NG
$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];
// OK
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
- XSS(クロスサイトスクリプティング)対策
出力時にhtmlspecialchars()を通すだけです。お金メモということは金額データが入っているはずなので、ここも必須です。
echo htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
無料でセキュリティを底上げする方法
InfinityFreeで運用されているとのことですが、Cloudflare(無料プラン)を前段に入れるだけでかなりセキュリティが改善します。
• SSL/HTTPS: 無料で自動適用。通信が暗号化される
• WAF(Webアプリケーションファイアウォール): SQLインジェクションやXSSの攻撃パターンをCloudflare側でブロックしてくれる
• DDoS対策: 無料プランでも基本的な対策が有効
• Bot対策: 不審なアクセスを自動フィルタリング
設定手順はドメインのネームサーバーをCloudflareに向けるだけなので、30分もあればできます。
もちろんCloudflareのWAFは完璧ではないので、コード側のSQLインジェクション対策・XSS対策は必ず併用してください。あくまで保険として「万が一コード側で漏れがあっても、Cloudflareが止めてくれる可能性がある」という二重防御の考え方です。
学習の次のステップとして
セキュリティ対策を自分で実装すること自体がとても良い勉強になります。無理せずに頑張ってくださいね。
- PDOプリペアドステートメント(SQLインジェクション対策)
- htmlspecialchars(XSS対策)
- CSRFトークン(フォームの不正送信防止)
- パスワードのハッシュ化(password_hash() / password_verify())
この4つが入れば、素のPHPでも十分実用的なセキュリティレベルになります。フレームワークなしで一つずつ自分で実装する方が、なぜ必要なのかの理解が深まりますよ。