HTMLの特殊文字とは
HTML上、ただの文字列ではなく、特殊な意味を持つ文字。
エスケープ処理前と処理後
エスケープすると...(例↓)
-
<
→<
-
&
→&
ブラウザがHTLMLをレンダリングするときに、<
が<
に変換される。
その他の対応表は例えば以下リンク等に記載されている
https://www.benricho.org/symbol/tokusyu_07_mark.html
エスケープ例
<script>alert("xssの危険")</script>
を文字列として出力したい場合。
エスケープ処理
<?php
$str = '<script>alert("xssの危険")</script>';
function h($s) {
return htmlspecialchars($s, ENT_QUOTES, "UTF-8");
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<?php echo h($str);?>
</body>
</html>
ブラウザで見るとJavaScriptのAlertダイアログを動作せず、
<script>alert("xssの危険")</script>
と表示される。
ページのソースを見ると、
<script>alert("xssの危険")</script>
となっており、**ブラウザがHTMLをレンダリングする時に、**意図した文字列に変換され、出力されることがわかる。
一旦全てをエスケープした後に、特定の特殊文字を復活させる
- 特殊文字は、
&#数字;
で表される。 - エスケープすることで
&#数字;
になる - 特定の特殊文字を復活させるには正規表現を使って
&
を&
にする
エスケープ処理
<?php
public static function escape_white_list($str){
$str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
//◆,♬をホワイトリスト化
$str = preg_replace('/&#(|9670|9836);/', '&#$1;', $str);
return $str;
}
?>
■ 正規表現の後方参照
- preg_replaceの第二引数の
$1
は、正規表現の後方参照という機能 - 第一引数の括弧「()」で括った内容が一時的に記憶され、その内容を後で使えるというもの。
- 1番目の括弧は
$1
、2番目の括弧は$2
で参照可能となる。
さらに詳しい参考記事
https://d2b6.dg8.top/article/412400033.html