0
3

More than 3 years have passed since last update.

HTML PHP 特殊文字 エスケープ処理

Last updated at Posted at 2020-05-22

HTMLの特殊文字とは

HTML上、ただの文字列ではなく、特殊な意味を持つ文字。

エスケープ処理前と処理後

エスケープすると...(例↓)

  • <&lt;
  • &&amp;

ブラウザがHTLMLをレンダリングするときに、&lt;<に変換される。

その他の対応表は例えば以下リンク等に記載されている
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>

と表示される。

ページのソースを見ると、

&lt;script&gt;alert(&quot;xssの危険&quot;)&lt;/script&gt;

となっており、ブラウザがHTMLをレンダリングする時に、意図した文字列に変換され、出力されることがわかる。

一旦全てをエスケープした後に、特定の特殊文字を復活させる

  • 特殊文字は、&#数字;で表される。
  • エスケープすることで&amp;#数字;になる
  • 特定の特殊文字を復活させるには正規表現を使って&amp;&にする
エスケープ処理
<?php

    public static function escape_white_list($str){
        $str = htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

        //◆,♬をホワイトリスト化
        $str = preg_replace('/&amp;#(|9670|9836);/', '&#$1;', $str);

        return $str;
    }
?>

■ 正規表現の後方参照

  • preg_replaceの第二引数の$1は、正規表現の後方参照という機能
  • 第一引数の括弧「()」で括った内容が一時的に記憶され、その内容を後で使えるというもの。
  • 1番目の括弧は$1、2番目の括弧は$2で参照可能となる。

さらに詳しい参考記事
https://d2b6.dg8.top/article/412400033.html

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3