雄太を石川さんに負けないエンジニアにするための講座

セキュリティについて勉強しよう

主な脅威

XSS
SQLインジェクション
CSRF
セッションに関する事

他にもあるけど、とりあえずここまで

脅威に対する対策

XSS対策

htmlspecialchars() 関数を利用し特殊文字をエスケープします。

例) 以下、掲示板スクリプト内(conf.php)にてエスケープを記載
※$_POST["name"]と$_POST["title"]と$_POST["body"]がユーザー入力値

if(isset($_POST["name"])){$_SESSION["name"] = $_POST["name"];}
if(isset($_POST["title"])){$_SESSION["title"] = $_POST["title"];}
if(isset($_POST["body"])){$_SESSION["body"] = $_POST["body"];}

error_check($_POST["name"],$_POST["title"],$_POST["body"]);

$view_name = htmlspecialchars($_SESSION["name"],ENT_QUOTES);
$view_title = htmlspecialchars($_SESSION["title"],ENT_QUOTES);
$check_body = htmlspecialchars($_SESSION["body"],ENT_QUOTES);

SQLインジェクション対策

①エスケープ
・文字列であれば ⇒mysql_real_escape_string()関数を使いSQL文に挿入する値をエスケープする。

例) 以下、掲示板スクリプト内(function.php)のログイン関数(login)にてエスケープを記載

※$_POST["loginname"]と$_POST["password"]がユーザー入力値

function login($login) {
$db = mysql_connect('localhost','yuta','yuta');
mysql_select_db('yuta',$db);

if(isset($_POST["loginname"])){$loginname = $_POST["loginname"];}
if(isset($_POST["loginpassword"])){$loginpassword = $_POST["loginpassword"];}

$loginname = mysql_real_escape_string($loginname);
$loginpassword = mysql_real_escape_string($loginpassword);

$loginpass = md5($loginpassword);

$query3 = "SELECT * FROM user_data WHERE name = '$loginname' and user_pass = '$loginpass'";

$result3 = mysql_query($query3, $db);

・数値であれば ⇒intval() 関数を使いSQL文に挿入する値を数値化する。

例)以下、掲示板スクリプト内(function.php)のページング処理にて記載 
※エスケープではなく使用例 

$page = intval(@$_GET["page"]); if($page < 1){$page = 1;}

②プリペアドステートメント(事前にSQL文を用意)
例)フォームで入力したキーの値に応じたデータを取得します。 ユーザの入力内容は自動的に引用符で括られるので、SQLインジェクション攻撃を回避できます。 下記はデータの取得

$dbh = "データベースへアクセスhogehoge";
$stmt = $dbh->prepare("SELECT * FROM kijiban_data where name = ");
if ($stmt->execute(array($_GET['name']))){while ($row = $stmt->fetch())
{print_r($row); } }

CSRF対策 and セッション対策

ここわかりやすいです。
CSRFとは↓
http://www.ipa.go.jp/security/vuln/vuln_contents/csrf.html
その対処法↓
http://labo.iix.co.jp/?p=655 

例)実際にやってみた。掲示板スクリプト内(conf.php)のユーザー入力確認画面から (add.php)入力完了画面にかけてhiddenにて秘密の値(ワンタイムトークン)を送信⇒受信確認することで対策 

■conf.php
ワンタイムトークンの発行
$token = md5(rand());
$_SESSION['token'] = $token;


■add.php

if(!isset($_SESSION['token'])|| $_SESSION['token'] != $_POST['token']){ echo "不正なアクセスです"; exit();}

課題

各脅威について調べて、各脅威に対するPHPで実現できる対策をまとめる

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-30 (金) 14:09:39 (37d)