セキュリティ対策について、自分の言葉でわかりやすくキロク。
#CSRF(cross-site request forgeries):クロスサイトリクエストフォージェリ
###CSRFの例
例えば、お問い合わせフォームなどで、送信
ボタンを押した際、
悪意のあるユーザによって作成された遷移先にたどり着いてしまったら、
個人情報が盗まれてしまうかもしれない。
###対策
対策としては、元のページと、遷移先のページが同じ管理元であることを確かめる必要がある。
合言葉を作って確認するのです。
その合言葉はtokenと言われるもので、数十桁の意味のない文字列を都度生成する。
その合言葉(token)をsessionに格納し、遷移先で一致しているか確認し、一致していた場合に処理を続ける。
それ以外の場合は弾く、とすれば、CSRFの脅威から守られる。
- tokenに、意味のない文字列数十桁を生成する
- $_POSTで取得するtokenは、formのタイプ:hiddenで送る
- sessionに格納したtokenと、hidden送信されたtokenをチェックし、一致していたら処理を続けます
以下にソースコードの一部を記します。
// post送信でtokenが取得できない、または、hiddenで送信されたtokenとsessionのtokenが一致しない場合
if (isset($_POST['token']) ===false || $_POST['token'] !== $_SESSION['token']){
header('location:index.php'); // トップページへ遷移
$_SESSION = array(); // 不正なtokenだったからsessionから削除しておく
exit; // 処理を抜ける
} else {
//処理を続ける
}
#XXS(Cross Site Scripting):クロスサイトスクリプティング
###XXSの例
Webサイトの脆弱性を攻撃する。
例えば、リンクのURLに罠を仕掛けて、悪意のあるページに引き寄せる。
そして、正規のサイトに似たページが表示され、そこで、ID、パスワードなどを入力させ、情報が抜き取られる(フィッシング)。
###XSS対策
悪意のあるユーザーがスクリプトを埋め込もうとしても、それらを無効にする必要があります。
対策として、
私はいつも安全に表示するためのユーザー関数を定義しておいて(下コード参照)、PHPのprintで出力するタイミングでこの関数を使用するようにしています。
// 安全に表示するユーザー関数
function h($value) {
return htmlspecialchars($value, ENT_QUOTES, 'utf-8');
}
#SQLインジェクション
###SQLインジェクションの例
SQL文として成立する文字列が不正に送られて、データベースを操作されること。
XSSはWebサイトの脆弱性を攻撃してくるのに対し、SQLインジェクションは相手のデータベースに攻撃を仕掛ける。
###対策
プレースホルダやバインド変数やprepaired statementを利用して、
SQL文には、変数などの値を入力しないようにする。
以下コードは値をバインドしている例
SQL文には、値を代入せず、'?'を代用して、SQL文を実行する際に値を代入しています。
$sql = 'INSERT INTO items(name,price)VALUES(?,?)'; // SQL文
$stmt = $dbh->prepare($sql); // 準備
$stmt -> execute(['apple', 100]); // 実行
今回は、セキュリティ対策についてキロクしました。
最近、大手企業への不正アクセスがあり、個人情報がもれた、などの報道がありました。
こんな悪いこと誰がするんだろう、って思ってたけど、いるんですね、悪い人は。
そんな悪さに負けないWebサービスを作ってみたいものです。