#XSS対策
##XSSとは
XSSとはクロスサイト・スクリプティングの略です。
ユーザーの入力したデータを利用するWEBサイトに対して、
悪意のあるHTMLタグやJavascriptコードを注入し、閲覧者に送信する攻撃です。
##htmlspecialchars
文字列に含まれる特殊文字を抜き出して、htmlで記号として出力できるように、変換して文字列を返す関数です。
特殊文字の変換例
変換前 | 変換後 |
---|---|
< | < |
> | > |
& | & |
" | " |
htmlspecialcharsは次のように記述します。
htmlspecialchars(文字列,変換スタイル,文字コード)
この変換スタイルは、クォートや文書などの扱いを指定します。
デフォルトではENT_COMPATが指定されているので、クォートはダブルクォートだけが変換されます。
ここでよく使われる変換スタイルをまとました。
定数 | 意味 |
---|---|
ENT_COMPAT | ダブルクォートは変換、シングルクォートは変換しない |
ENT_QUOTES | ダブルクォートもシングルクォートは変換 |
ENT_NOQUOTES | ダブルクォートもシングルクォートは変換しない |
ENT_HTML5 | コードを HTML 5 として処理 |
##改行のみ出力するには・・・
改行がない文章なんて見づらくて仕方ありません。
「HTMLのタグなどの部品はそのまま表示したいけど、改行文字は改行として扱ってほしい」
そんな時に便利な関数がnl2br()
です。
nl2br(文字列)
を実行すると、\n
や\r
などの改行文字の前に、HTMLの改行タグ<br>
を挿入した文字列を返してくれます。
こうして改行してほしいところで改行してくれる文字列を作成できます。
echo nl2br(htmlspecialchars($remark,ENT_QUOTES)) ;
htmlspecialcharsとnl2brを使用して、このようにXSS対策をしながら、改行をHTML上に反映しました。
#SQLインジェクション
##SQLインジェクションとは?
SQLインジェクションとは、SQL文に代入する変数に、SQLの操作に関わる文字を使うなどして、アプリが意図しないSQL文を実行させ、データベースを不正に操作する攻撃です。
##バインド機構
これを回避する方法の1つにバインド機構というものがあります。
バインド機構では、まずSQL文の中に変数の場所を記号(プレースホルダー)で確保しておきます。
そして後からその場所に変数を割り当てます。
こうすることで、特殊記号も単なる値として扱われるので安全なSQL文を作成できます。
$stmt = $db -> prepare("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (:entry_id,:student_id,:student_name,:student_age,:remark)");
$stmt->bindValue(':entry_id', $count, PDO::PARAM_INT);
$stmt->bindParam(':student_id', $number, PDO::PARAM_STR);
$stmt->bindParam(':student_name', $name, PDO::PARAM_STR);
$stmt->bindValue(':student_age', $age, PDO::PARAM_INT);
$stmt->bindParam(':remark', $remark, PDO::PARAM_STR);
$stmt->execute();
:名前
でプレースホルダ―を用意します。
bindValueとbindParamメソッドを使って、プレースホルダーに実際の値を割り当てます。
そして最後にexecuteメソッドでSQL文を実行します。