忘れがちなこと
- 出力側の対策と同じように入力側の対策も重要。
- 出力側の対策だけをしていると、サニタイズはできていても意図しない値が出力されてしまうことがある。
- 入力側の対策もしておけばフィルタリングに引っかかったら値を出力しない、ということもできる。
Reflected XSS All Clients
- 入力側対策
- 取得した値に対して無害化、値チェック、値のホワイトリスト管理をする
- 以下のコードはGETパラメータに「<」「>」が含まれなかったら出力するという意味
if(preg_match("/^[^\<\>]+$/", $_GET["keyword"])){
echo $_GET["keyword"];
- 出力側対策
- 出力時にサニタイズをする
- PHPはhtmlspecialchars
- JSはhtmlencoder.htmlEncode
- 出力時にサニタイズする意味
- 意図せぬところでデコードされる可能性がある
- 二重エスケープを防ぐため
- 出力時にサニタイズをする
echo htmlspecialchars( $_GET["keyword"], ENT_QUOTES, 'UTF-8');
SQLインジェクション
- 入力側対策
- 数字以外の場合は現在の年号に置き換える等
if (isset($_GET['year']) && is_numeric($_GET['year'])){
$selected_year = getList( $_GET['year'] );
else {
$selected_year = getList( date("Y") );
}
- 出力側対策
- GETパラメータをbindParam関数などで後からバインドさせる
- そうすることでSQL文にとって特別な意味を持つ;やスペースがただの文字列として認識される
$stmt->bindParam(':year', $_GET['year'], PDO::PARAM_INT);