入力フォームの脆弱性対策

入力フォームについてSQLインジェクションとXSSへの対策方法を考える。

まずSQLインジェクションについて説明する。

SQLインジェクションとは入力フォームにコマンドを含む文を入力することでSQLの誤作動を引き起こし、不正にログインを行う方法である。 例えばこのような入力フォームには、ユーザー名を’ OR 1=1; –のようにすることでパスワードを入力しなくてもログインできてしまう。

$sql = "SELECT*FROM user_info WHERE name='$username' AND password='$password'"

この原因は入力された文をサーバー内の検索を行うコマンドでそのまま使用していることなので、文に含まれる文字を全て値として扱うことができればこの問題は回避される。 値として扱うため一時的に保留状態にしておき、あとで渡すようにするとこのようになる。こうすることで文中の文字を特殊文字として読むことはなくなる。

$sql = "SELECT*FROM user_info WHERE name=? AND password=?";
$stmt = $dbh->prepare($sql);
$stmt->execute(array($username, $password));

この時使った?はプレースホルダと呼ばれる。

次にXSSの対策を考える。

XSSとはCross Site Scriptingの略称で、他人のウェブサイトに悪意のあるスクリプトを埋め込むことを指す。手口としてはかかった人のクッキー情報を流出させる、悪意のある入力フォームを表示し入力してしまった人の個人情報を獲得するなどがある。

対策としてはSQLインジェクションと同様に特殊文字をエスケープさせることが第一になる。こちらは文字列をそのまま表示する部分に仕込まれているため、htmlsupecialcharsなどを用いてエスケープさせることになる。

 <?php if ($logged_in): ?>
        <?php echo h("こんにちは".$_POST["username"]."さん")?>
<?php elseif (!empty($_POST["username"])):?>
        <?php echo h($_POST["username"]."さんが見つかりませんでした。入力情報を確認してください")?>

このほかにも脆弱性には様々なものがあるため、注意が必要になる。