【 PHP 】PHP8に入門してみた 224日目 PHPの基本 ( 高度 セキュリティ その2 )

2023年4月2日

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

高度

SQLインジェクション への対処

PHPにおいて、SQLインジェクションへの対処他の言語同様にプリペアドステートメントで行うようです。

プリペアドステートメントを使用することで、SQL文に動的に変更があった場合でも、SQLインジェクション攻撃による不正な操作を防ぐことができます。
プリペアドステートメントを使用することで、入力値がSQL文に埋め込まれる前に、自動的にエスケープ処理が行われます。

$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');
$stmt->execute(['username' => $username]);

他にも以下のような対策が考えられそうです。

  • 入力値のバリデーションを行う
    入力値のバリデーションを行うことで不正な入力値を拒否することができます。
    例えば、ユーザー名に特殊文字を含めることができないようにするなど、入力値に対する制限を設けることが有効です。
  • エスケープ処理を行う
    入力値にエスケープ処理を行うことで、SQL文に埋め込まれる文字列に特殊な意味を持たせることができなくなります。
    例えば、シングルクォーテーションをエスケープすることで、文字列の中にシングルクォーテーションを含めることができなくなります。

OSコマンドインジェクションは?

以下のような対策がよさそうです。

  1. ホワイトリスト方式による入力値の制限
    入力値をホワイトリスト方式によって事前に制限することで不正な入力値を排除することができます。
    例えば、ユーザーからの入力値が数値であることを期待する場合にはその入力値が数値であるかどうかを確認することができます。
  2. シェルエスケープ処理を行う
    入力値にシェルエスケープ処理を行うことで、不正なOSコマンドの実行を防止することができます。
    例えば、シングルクォーテーションやダブルクォーテーションなど特殊な意味を持つ文字をエスケープすることが有効です。
  3. システムコールを直接使用しない
    OSコマンドを実行する場合には、システムコールを使用することが一般的ですがシステムコールを直接使用すると不正なOSコマンドが実行される危険があります。
    そのため、システムコールをラップしたライブラリやツールを使用することが推奨されます。
    もっともですね😉

メモ

インジェクション関連はフレームワークで吸収(対策)していることが多いです。
それだけ被害が多いということなのでしょうかね。

PHPPHP

Posted by raika@blog