phpの学習に使っている手元にある本にmysql_real_escape_stringという関数が使用されていました。
しかしこの関数が意味するところを調べてみると、もう非推奨となっていました。
そこでPDO::quoteに出会い、今回はそれを勉強してみました。
(名著なのですが2008年のものなので仕方ないみたいです・・・)
セキュリティの不備を利用して、不正なSQL文を実行させることによって、データベースシステムを不正に操作する攻撃手法のことをSQLインジェクションと言います。
このSQLインジェクションに対策を打つべく外部から文字列を入力してデータベースを操作する場合にはサニタイジング処理を行わなければいけません。
これはエスケープ処理とも言われ、特殊文字をエスケープしてくれます。
PDO::quote()ではエスケープ処理をしてくれます。
以下のコードでは、もうすでにデータベースにアクセスしているものとします。
<?php //データベースにアクセスして選択する $user = '****'; $pass = '*****'; try { $dbh = new PDO('mysql:host=localhost;dbname=*****', $user, $pass); if($dbh){ echo "データベースへの接続に成功しました。"; }else{ echo "データベースへの接続に失敗しました。"; } } catch (PDOException $e) { print "エラー!: " . $e->getMessage() . "<br/>"; die(); } ?> <?php//エスケープ処理 $string = 'Nice'; print "Unquoted string: $string\n"; print "Quoted string: " . $dbh->quote($string) . "\n"; ?>
Unquoted string: Nice Quoted string: 'Nice'
となります。
このようにシングルクオートがエスケープされます。