PHPにおけるSQLインジェクションやXSS対策

SQLインジェクション

SQLインジェクションとは

SQLインジェクションとはWebアプリケーションに問題があるとき,データベースに悪意のある問合せや操作を行う命令文を入力して,データベースのデータを改ざんしたり不正に取得したりする攻撃手法のことです.

例えばデータベースにおいてname, passwordというカラムがあったとして,

$username = $_POST["username"];
$userpass =  $_POST["password"];

この様に変数に格納し,以下の様なプログラムを作成します.

SELECT * FROM user_info WHERE name = '$username' AND password = '$userpass';

これで,nameとpasswordが入力と一致するかどうか確認します. では,以下の様な入力があった際はどうなるでしょうか?

$username : user1
$password : ' OR 'A' = 'A

上記のプログラムで値を代入するとこのようになります.

SELECT * FROM user_info WHERE name = 'user1' AND password = '' OR 'A' = 'A';

これによりWHERE句になってしまい,passwordがわからなくてもログインできてしまいます.

対策

具体的な対策としては,以下のようにSQL文の入力される変数の部分に?などの文字を置いておき,あとから該当部分に割り当てるというものがあります.

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

この?で置き換えるという手法をプレースホルダと言います.

XSS

XSSとは

XSSとは、クロスサイトスクリプティング(Cross Site Scripting)の略で,訪問者の入力データをそのまま画面に表示するWebサイトに対して,悪意のあるスクリプトを埋め込んだ入力データを送ることによって,訪問者のブラウザで実行させるという攻撃手法のことです. 例えば,入力された文章がそのまま出力されるWebページがあったとします,そこに以下のような文章を入力し,送信したらどうなるでしょうか.

<script>alert('XSS');</script>

この文章はJavaScriptを用いてXSSという文章をブラウザ上で出力するだけのコマンドですが,これを利用してWeb上のcookieを盗み,不正ログインできてしまったり,Webページを改ざんできてしまったりします.

対策

以下のようなプログラムにXSS対策を施したいとします.

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

その場合はechoの引数全体をhtmlspecialchars関数、またはhtmlentities関数で囲ってあげれば良いのです. つまり、このようになります.

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

HTMLで特殊文字扱いとされる文字は5つありますが,その文字のみ除外するものがhtmlspecialchars関数で,それ以外のUTF-8などで扱われる特殊な文字も除外するのがhtmlentities関数です. なので実際には前者で事足りるので,後者はあまり使わないかもしれません.

SQLインジェクション – IPA

https://www.ipa.go.jp/security/vuln/vuln_contents/sql.html

クロスサイト・スクリプティング – IPA

https://www.ipa.go.jp/security/vuln/vuln_contents/xss.html