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