質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3126閲覧

filter_input関数の「FILTER_SANITIZE_SPECIAL_CHARS」についてです

newyee

総合スコア213

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/04/09 00:35

掲示板のフォーム画面より、<inputy type="text" name="name">などにより、名前やコメントを入力し、送信(投稿)した際受け取り側のプログラムで、$name = filter_input(INPUT_POST,'name',FILTER_SANITIZE_SPECIAL_CHARS);とし、filter_input関数を通して、受け取る際、「FILTER_SANITIZE_SPECIAL_CHARS」を指定した場合としなかった場合で、違いがあるのか検証する為、「FILTER_SANITIZE_SPECIAL_CHARS」を指定し、「echo $name;」とした場合と「FILTER_SANITIZE_SPECIAL_CHARS」を指定せずに、「echo $name」した場合を比較してみたのですが、違いが出ませんでした。送信する値の入力側では、「>」や「<」を入力した為、「>」は「&lt」と「<」は「&gt」と出力されると思ったのですが、値が置き換わって出力されることはありませんでした。
具体的な、入力側のプログラムが以下の「bbs.php」になります

php

1<?php 2require_once 'config.php'; 3require_once 'function.php'; 4session_start(); 5$page = 0; 6$num = 10; 7if(isset($_GET['page']) && $_GET['page'] > 0){ 8 $page = intval($_GET['page']) -1; 9} 10 11try{ 12 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 13 $stmt = $db->prepare(" 14 SELECT id, name,title,comment,date FROM post_2 ORDER BY date DESC LIMIT :page, :num 15 "); 16 17 $page = $page * $num; 18 19 $stmt->bindValue(':num',$num,PDO::PARAM_INT); 20 $stmt->bindValue(':page',$page,PDO::PARAM_INT); 21 $stmt->execute(); 22 $db_data = $stmt->fetchAll(PDO::FETCH_ASSOC); 23 24 //var_dump($result); 25 //exit(); 26 27 28 29}catch(PDOException $e){ 30 $e->getMessage(); 31} 32 33?> 34 35 36<!DOCTYPE html> 37 38<html> 39<head> 40 <meta charset="utf-8"> 41 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 42 <title>掲示板</title> 43 <meta name="viewport" content="width=device-width, initial-scale=1"> 44 <link rel="stylesheet" type="text/css" media="screen" href="main.css"> 45 <script src="main.js"></script> 46 47</head> 48<body> 49 <h1>掲示板</h1> 50 <form action="write.php" method="post"> 51 <p>名前:<input type="text" name="name"></p> 52 <p>タイトル:<input type="text" name="title"></p> 53 <textarea name="comment" cols="50" rows="5"></textarea> 54 <p>削除パスワード(数字4桁):<input type="text" name="password"></p> 55 <input type="submit"value="書き込む"> 56 </form> 57 <hr> 58 <?php 59 foreach($db_data as $row): 60 $title = $row['title'] ? $row['title'] : '(無題)'; 61 ?> 62 <p>名前:<?= h($row['name']) ?></p> 63 <p>タイトル:<?= h($title) ?></p> 64 <p>本文:<?= h($row['comment']) ?></p> 65 <p> 66 日付:<?= h($row['date']) ?> 67 <form action="delete.php" method="post"> 68 <input type="password" name="delete_password"> 69 <input type="hidden" name="id" value="<?php echo $row['id']?>"> 70 <input type="submit" value="削除"> 71 </form> 72 </p> 73 74 <?php endforeach; 75 76 77 try{ 78 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 79 $stmt = $db->prepare(" 80 SELECT COUNT(id) FROM post_2; 81 "); 82 83 $stmt->execute(); 84 85 }catch(PDOExeption $e){ 86 $e->getMessage(); 87 } 88 89 $page_id = $stmt->fetchColumn(); 90 $max_page = ceil($page_id / $num); 91 92 echo '<p>'; 93 94 for($i = 1; $i <= $max_page; $i++){ 95 96 echo '<a href="bbs.php?page=' . $i . '">' . $i . '</a>&nbsp;'; 97 } 98 echo '</p>'; 99 100 ?> 101 102</body> 103</html>

受け取り側の、「write.php」は以下のコードとなります

php

1<?php 2 3require_once 'function.php'; 4require_once 'config.php'; 5 6$err = []; 7 8if(!empty($_POST)){ 9 10$name = filter_input(INPUT_POST,'name',FILTER_SANITIZE_SPECIAL_CHARS); 11echo $name; 12PHP_EOL; 13 14 $comment = filter_input(INPUT_POST,'comment'); 15 echo $comment; 16 exit(); 17 $password = filter_input(INPUT_POST,'password'); 18 $title = filter_input(INPUT_POST,'title'); 19 20 if(!$name){ 21 $err['name'] = '名前が入力されていません'; 22 } 23 24 if(!$comment){ 25 26 $err['comment'] = '本文が入力されていません'; 27 28 } 29 30 if(!$password){ 31 32 $err['password'] = 'パスワードが入力されていません'; 33 34 }elseif(!preg_match("/^[0-9]{4}$/",$password)) 35 { 36 $err['password'] = 'パスワードは数字4文字で入力してください'; 37 } 38 39 if(!$title){ 40 41 if(strlen($title) > 255) 42 { 43 $err['comment'] = '本文は255文字以内で入力して下さい'; 44 } 45 46 } 47 48 if(empty($err)){ 49 50 $password = password_hash($password,PASSWORD_DEFAULT); 51 52 try{ 53 54 $db = db_connection(DSN,DB_USERNAME,DB_PASSWORD); 55 $stmt = $db->prepare(" 56 INSERT INTO post_2 (name,title,comment,date,password) 57 VALUES(:name,:title,:comment,now(),:password) 58 "); 59 60 $stmt->bindValue(':name',$name,PDO::PARAM_STR); 61 $stmt->bindValue(':title',$title,PDO::PARAM_STR); 62 $stmt->bindValue(':comment',$comment,PDO::PARAM_STR); 63 $stmt->bindValue(':password',$password,PDO::PARAM_STR); 64 $stmt->execute(); 65 header('Location:bbs.php'); 66 exit(); 67 }catch(PDOException $e){ 68 69 die('エラー:' . $e->getMessage()); 70 71 } 72 73 } 74 75} 76 77?> 78<!DOCTYPE html> 79<html> 80<head> 81 <meta charset="utf-8"> 82 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 83 <title>Page Title</title> 84 <meta name="viewport" content="width=device-width, initial-scale=1"> 85 <link rel="stylesheet" type="text/css" media="screen" href="main.css"> 86 <script src="main.js"></script> 87</head> 88<body> 89 <?php if(count($err) >= 1): ?> 90 <h3>エラー!</h3> 91 92 <?php foreach($err as $value): ?> 93 94 <p> 95 <?=$value?> 96 </p> 97 98 <?php endforeach; ?> 99 100 <?php endif;?> 101</body> 102</html> 103

上記疑問につきまして、ご助言頂けましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

検証するなら、検証したい内容だけを試すスクリプトを書いた方が早いですよ。私も簡単に書いてみました。

入力フォーム (183529.html)

HTML

1<body> 2<form action="183529.php" method="POST"> 3A:<input name="a"><br> 4<input type="submit"> 5</form> 6</body>

受け取り側 (183529.php)

PHP

1<?php 2 header('Content-Type: text/plain'); // コンテントタイプとしてプレーンテキストを指定 3 echo 'SANITIZE OFF:' . filter_input(INPUT_POST, 'a') . "\n"; 4 echo 'SANITIZE ON :' . filter_input(INPUT_POST, 'a', FILTER_SANITIZE_SPECIAL_CHARS) . "\n";

このスクリプトで、以下の文字列を入力すると…

<script>alert("a")</script>

以下の結果が得られます。

SANITIZE OFF:<script>alert("a")</script> SANITIZE ON :&#60;script&#62;alert(&#34;a&#34;)&#60;/script&#62;

<>"がHTMLエスケープされていることがわかります。上記のスクリプトはプレーンテキストを指定しているので <や > があっても正しく表示されますが、HTML (text/html)の場合は < → < > → > 等と変換しないと正しく表示されません。これをHTMLエスケープといいます。他の方も指摘されているように、この処理はクロスサイト・スクリプティング対策としても重要ですが、これがないと文字が正しく表示されないという意味で、セキュリティ対策以前に必要な処理です。

では、FILTER_SANITIZE_SPECIAL_CHARSを使えばよいかというと、そうではありません。こんなもの、普通は使いません。では、どうするかというと、以下のようにします。

投稿処理: 入力 → さまざまな処理 → データベース等に格納  (ここまでHTMLエスケープしない)

表示処理: データベースから文字列を取り出し → さまざまな処理 → HTMLエスケープ → 表示

そして、HTMLエスケープには、専用の関数である htmlspecialcharsを使います。
つまり、HTMLエスケープは、表示の直前に一度だけ行います。

では何故 FILTER_SANITIZE_SPECIAL_CHARS みたいな機能があるかというと、昔はこれが一般的だったからです。しかし、この考え方は、後に否定されました。

例えば、掲示板に投稿する文字数を数える場合を考えてみてください。文字列がエスケープ済みだと、文字数のカウントが間違ってしまいますよね。このような場合、昔はHTMLエスケープをもとに戻す処理(アンエスケープ)をしていました。これ、かえって面倒ですし、エスケープしたりアンエスケープしたりを繰り返しているうちに訳がわからなくなって、表示が化けたり、脆弱性の原因になったりします。

なので、HTMLエスケープは表示の直前に一度だけ行うようになった…というか、元々そうすべきだったのですが、正しいやり方が広まったのです。

HTMLエスケープはHTML表示のための処理ですから、HTMLとして表示する際に初めて行えばよいのです。

投稿2019/04/09 02:19

ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2019/04/09 03:15

ご丁寧にご回答頂きまして、ありがとうございます。 提示頂きました、コードを実行してみましたら、エスケープされた文字が出力され、検証することができました。すみません。一点だけ、疑問な点がございまして、お聞きしたいことがあるのですが、受け取り側のプログラムである「183529.php」にて、「header('Content-Type: text/plain'); // コンテントタイプとしてプレーンテキストを指定」との記載があったのですが、こちらを外しましたら、改行もされず、「SANITIZE OFF: SANITIZE ON :<a href ="2222">」と表示され、「SANITIZE ON :<a href ="2222">」ここの部分がリンクとなっていました。こちらの部分につきまして、理解できない部分があり、少し、ご教授頂いてもよろしいでしょうか...?
ockeghem

2019/04/09 10:53

header('Content-Type: text/plain'); は、表示をHTMLではなく単なるテキストとして解釈するという意味です。テキストの場合、タグの解釈はせず、単に文字として表示することになります。単なるテキストとして表示する場合に、たまに用います。静的ファイルで foo.txt 等を表示する場合も、通常は同じ結果になります。
newyee

2019/04/09 11:12

ご返信頂きありがとうございます。 タグが解釈されない為、ただのテキストとして、表示されていたからなのですね...理解することができました! 大変分かりやすく、ご回答くださりありがとうございました。 「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」こちら、購入するか迷っていたのですが、購入しようと思います!笑
guest

0

PHP: 除去フィルタ - Manual

'"<>& および ASCII 値が 32 未満の文字を HTML エスケープします。オプションで、 特殊文字を取り除いたりエンコードしたりします。

エスケープ対象の文字を受信しない限り、違いはわからないでしょうね。
例えばweb上に表示するフォームで手入力する文字なら差し支えないでしょうけど、
プログラムなどで意図的に特定のフォームの特定の入力項目を狙って送信する場合などには差が出るでしょう。

そんなプログラムはどうやって書くのかというと、例えば:
PHPでPOST送信する方法 - Qiita
記事内での$dataに〈'"<>& および ASCII 値が 32 未満の文字〉を含めたものを用意すれば
テストできます。

投稿2019/04/09 01:28

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2019/04/09 03:22

ご回答ありがとうございます。 貼って頂きましたリンク、参考にさせて頂きたいと思います。
guest

0

ベストアンサー

すみません。最初に苦言を呈しますが、
もう少しきちんとサーバー側の言語の概念を理解し、検証してから質問してほしかった。
検証は「今作っているなんかそれなりのコード量があるアプリケーション」のコードではなく
「最低限の動作確認ができるミニマムコード」であるべきです。
じゃないと色々な入力や手続きがあったりして本来確認したいところだけ確認できませんよね?

「見たいところだけ見れるようにする」それも工夫です。
これができると処理の細分化ができるようになって、部品を作って使うということができます。
(以前あった「処理の共通化・切り出し」にも大いにつながるところです)

そもそもですがphpはリクエストにそって処理を行い、出力を行っているだけです。
それをブラウザで見るから出力内容を解釈してhtmlならhtmlとして解析して画面表示を行っているだけです。
「出力」を勘違いされているように思います。


さて、エスケープについて理解するにはまず、攻撃手法を理解する必要があります。
何のために”出力時に”エスケープをかけるか?
それは、フリーで登録できる入力欄は何が入力されるかわからない。
DBに登録する際も文字数のチェックのみだと通りますよね。

その送信・登録された情報が画面に表示されると何が都合が悪くなるか。

1つはhtmlタグ
これによってレイアウトを崩すことができます。
単に<や&だけでは脅威はありません。
htmlタグです。

例えば、
<a href="何かURL">
と入力、送信されたものをそのまま表示させるとどうなるか。

aタグの閉じ</a>がないので表示された以降全てがリンクになりますね。

※ミニマムコードとしてEnterでSubmitするのでボタン設けてません

php

1<?php 2$name = filter_input(INPUT_POST,'name'); 3?> 4<!DOCTYPE html> 5<html> 6<head> 7<meta charset="utf-8"> 8<title>お名前登録</title> 9</head> 10<body> 11<form method="post"> 12<input name='name'> 13</form> 14<?=$name ?>さんこんにちは 15</body> 16</html>

↓出力されるhtml

html

1 2<!DOCTYPE html> 3<html> 4<head> 5<meta charset="utf-8"> 6<title>お名前登録</title> 7</head> 8<body> 9<form method="post"> 10<input name='name'> 11</form> 12<a href="何かURL">さんこんにちは 13</body> 14</html>

ブラウザ表示
イメージ説明

これができるということは、なんでもできそうということは想像に難くないですよね。
インラインCSSも仕込めます。容赦なくサイトのレイアウトを壊せるわけですし、
宣伝も仕込むことができます。

2つ目はJavaScriptコード
こちらのほうが厄介です。
<script></script>タグがあればブラウザはその囲いの中は全てJavaScriptコードとしてみなします。

<script>alert(1);</script>
と入れて送信してみてください。

※ちなみにChromeなどではそもそも<script></script>を送信しようとしたら異常を感知してブロックしてくれたりしますので、他のブラウザで試したほうが良いです。

出力されるhtml

html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>お名前登録</title> 6</head> 7<body> 8<form method="post"> 9<input name='name'> 10</form> 11<script>alert(1);</script>さんこんにちは 12</body> 13</html> 14

ブラウザ表示
イメージ説明
※Microsoft Edge

JavaScriptが動作させられるということは、それこそなんでもできてしまいますね。
Ajaxで不正なサイトにアクセスさせたりとか。無限ループ仕込んでフリーズさせたり、ブラウザクラッシャー仕掛けたり。

今回は単行のテキスト入力なので入力文字数のチェックを行っていることも多いかと思いますが、
これがtextareaとなると入力可能文字数が非常に多くなるでしょうし、DB的にはtext型に保存するような仕組みの場合、入力文字制限が実質ないようなものもあるでしょう。

※今回詳しく触れないですが<style></style>を書けばCSSも指定できるので、既存の指定を上書きするような組み方もできます。

つまり、htmlやJavaScriptのコードを送信して、機能してないかどうかを確認するのが、正しい検証方法です。
<や&だけ送信しても何も怖くないです。単一の記号ですし。


というのが導入部分で、主なところで、基礎知識として持っておくべきところです。
攻撃手法については「クロスサイトスクリプティング(XSS)」で調べておいてください。
もちろん他にもSQLインジェクションだとか色々と攻撃手法・脆弱性はあるので必ずおさえてください。

このあたり詳しくは、teratailで回答もされている方が出しているWeb業界では有名な本とかもあるので(「徳丸本」で検索)、読んでみると良いです。

あと、入力値検証も含めた考え方だと下記が参考になると思います。


「>」や「<」を入力した為、「>」は「&lt」と「<」は「&gt」と出力されると思ったのですが、値が置き換わって出力されることはありませんでした。

本来は「出力するときに対応するもの」ですが、とりあえずできあがったhtmlソースを見ましょう。
「出力」というのはあくまでphpの処理結果であり、ブラウザから見た画面表示ではありません

FILTER_SANITIZE_SPECIAL_CHARSをつけなかった場合は提示の通りですね。

<a href="何かURL">さんこんにちは

つけた場合、

ブラウザ表示
イメージ説明
htmlソース

&#60;a href=&#34;何かURL&#34;&#62;さんこんにちは

サニタイズされてますね。

本来はこうすべき。

php

1<?php 2$name = filter_input(INPUT_POST,'name'); 3?> 4<!DOCTYPE html> 5<html> 6<head> 7<meta charset="utf-8"> 8<title>エスケープテスト</title> 9</head> 10<body> 11<form method="post"> 12<input name='name'> 13</form> 14<?=htmlspecialchars($name, ENT_QUOTES, 'UTF-8'); ?>さんこんにちは 15</body> 16</html>

↓出力されるhtml

html

1 2<!DOCTYPE html> 3<html> 4<head> 5<meta charset="utf-8"> 6<title>エスケープテスト</title> 7</head> 8<body> 9<form method="post"> 10<input name='name'> 11</form> 12&lt;a href=&quot;何かURL&quot;&gt;さんこんにちは 13</body> 14</html>

超蛇足:
ブラウザ上に「<」などと出したければ&もエスケープすることになるので重ねる。

php

1 2<?=htmlspecialchars(htmlspecialchars($name, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, 'UTF-8'); ?>さんこんにちは

大事な追記

冒頭要約すると
「そんな作りかけのそれなりの量があるコードで理解するのは無理」
ミニマムコードであれば幾ら失敗してもすぐ作り直しがきくし調整も容易なので、ミニマムコードで検証することを覚えるべきで、質問する際もそうするべき。
私が回答する際にミニマムコードを書いてきたのはそういう経緯から。
これも技術です。真似してください。

※もっと言えば掲示板くらいで失敗も何もないですけど質問者さんにとってはそれなりの規模なので、だからこそミニマムコードで検証は必須

エラーメッセージを主軸とした記事だけど、他も同じ。
"エラーが再現する小さなプログラムを作る"
最小限のプログラムでできないことはおおもとの全体のコードでもできるわけがないです。
記事より抜粋:これは大きなプログラムを作っている場合は特に有効だ. 一見遠回りのようだが, エラーの原因となる部分に集中することができるから, 結果的にはエラーの解決が早くなる.

SQLも同じ。直接実行して成功しないSQLはプログラムから実行しても成功するわけがないです。

Webページで動的レイアウトを組む時、先に静的HTMLで「モック」を作ってその形を目指してプログラミングしていくわけです。

作りかけのものをいったん破棄して本当に最小構成のものから試していかないと何も覚えませんし、
応用できるようになりませんし、ロジックは育ちません。

投稿2019/04/09 00:53

編集2019/04/09 02:13
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

newyee

2019/04/09 02:16

ご丁寧にありがとうございます。 入力フォームなどから、不正な文字が入力される攻撃手法は、本などで読んだことがあるのですが、実際にどういうことか、分かっていなかった部分もあった為、丁寧に説明して頂いたおかげで理解することができました。 セキュリティに関する書籍は購入するものか迷っているんですよね。実は、パーフェクトPHPや、laravelの本も買ったのは良いのですが、全然やっていないもので...laravelはもう少しスキルを上げてからだとは思うのですが、パーフェクトPHPはそろそろ読み進めていきたいなとは思っています。。。 今回ですと入力側のプログラム「bbs.php」で「<」や「&」を入力しても、受け取り側で、echoし出力しても、変わらなかった為、エスケープされていないじゃないかと思ったのですが、「<a href="何かURL">」と「aタグ」の閉じタグを記載せずに、名前とコメントの入力欄に入力し、受け取り側のプログラムでコメントのみ「FILTER_SANITIZE_SPECIAL_CHARS」を指定せずに受け取り、「bbs.php」のコメント一覧として、出力する際にもエスケープを行いませんでしたら、表示される、最新のコメント以下、全てのコメント一覧がリンクとなりました。 実際に、やはり動かしてみないとダメだなと実感しました... なんですが、一点だけ理解できない部分があり、お聞きしたいことがあるのですが、 名前を入力された際には、「FILTER_SANITIZE_SPECIAL_CHARS」を指定して受け取った為、bbs.phpのコメント一覧の名前の欄はリンクになっていなかったのですが、デベロッパーツールを開き、htmlソースを確認しましたら、「<a href="何かURL">さんこんにちは」このまま表示されており、「&#60;a href=&#34;何かURL&#34;&#62;さんこんにちは」このように表示されていませんでした。 ここの部分で何故なのかなと思ったのですが、どのようなことが原因だと思われますでしょうか?
newyee

2019/04/09 02:24

追記読ませて頂きました。 確かに、ミニマムコードで検証することが、処理の切り出しなどにもつながるというのはおっしゃる通りだと思いました。 ご質問する際や検証する際は、ミニマムコードで試していくことを心掛けたいと思います
m.ts10806

2019/04/09 02:34 編集

>ここの部分で何故なのかなと思ったのですが、どのようなことが原因だと思われますでしょうか? ブラウザデベロッパーツールの仕様。 デベロッパツール(開発者ツール)と銘打ってますがそれはブラウザ側が見やすいように加工してくれてるようなものです。 JavaScriptで動的に作っているDOMを表示してくれたり付与されたclassや%で指定されたwidthをそのときの実寸で見せてくれたりするわけです。 タグに囲まれている値はダブルクォーテーションで囲まれてますよね?それは「ここは実際に画面に表示される情報」という括りと思って差し支えありません。 あそこに出るのはあくまで加工された情報。エスケープされた文字が出ても誰もおいしくないですよね?ブラウザで見てるんだから。 さて、大事な追記をしましたがそちらは読まれましたか? どれだけ重要なことかは心にとどめていただきたいところです。 理解が進まない理由を書いています。
m.ts10806

2019/04/09 02:27

>ご質問する際や検証する際は、ミニマムコードで試していくことを心掛けたいと思います はい。よろしくお願いします。 あと私が中間で書いた本の作者さんの回答もついてます。私より詳しいところに突っ込んでますので参考にしてください。
m.ts10806

2019/04/09 02:37

>セキュリティに関する書籍は購入するものか迷っているんですよね。 「お作法でやっとけばいいよ」程度の理解ではWebに関わっていくのは難しいので 体系的に理解するためには必要不可欠。むしろ言語関係ないので入門よりも必要なことです。 攻撃手法を知っているから正しく回避・守りができるわけですから、必ず意味を理解して利用すべき。 そして、文字を追うだけでなくミニマムコードで試して頭に叩き込むべきです。
newyee

2019/04/09 02:44

ご返信ありがとうございます。 ブラウザの仕様だったのですね... ちなみになのですが、少し、興味本位で気になったのですが、こちらのような「&#60;a href=&#34;何かURL&#34;&#62;さんこんにちは」エスケープされた文字を確認する方法はありませんでしょうか?
m.ts10806

2019/04/09 02:45 編集

回答で伝わってませんでしたか? 「ブラウザ ソースを表示」 Chromeなら右クリック「ページのソースを表示」またはCtrl+U
newyee

2019/04/09 02:52

「Chromeなら右クリック「ページのソースを表示」」こちらで、ソースを表示することと、デベロッパーツールで、htmlソースを表示することを同じことだと勘違いしてしまっていました... 今、右クリックから、ソースを表示してみましたら、エスケープされた文字が表示されました。
m.ts10806

2019/04/09 02:55

レイアウトに関することでないのでしたらデベロッパーツールで確認するメリットはほとんどありません。 ElementsタブはあくまでCSS・JavaScriptなどクライアント側の機能の確認のためのものと思って良いです。 開発者として一番気にするべきなのは画面表示ではなく「意図した情報がきちんと出力されているか」なので。
newyee

2019/04/09 03:01

ご返信ありがとうございます。 デベロッパーツールで確認する癖があったので、これからは気を付けたいと思います。
m.ts10806

2019/04/09 03:06

もちろんWebでやっていくのでしたらJavaScriptやCSSのデバッグのためには有用なので覚えておいて損はありません。ただ、「phpはあくまで文字列を出力しているだけ」というところだけは忘れないようにしてください。 コメントのタイミングで流れているかもしれませんが、本質問はockeghemさんの回答が経緯まで突っ込んでくれているのでそちらが最も詳しいものです。 ※私が回答で紹介している「徳丸本」の作者さんです。Web関係では日本で一番有名な方だと思います。
newyee

2019/04/09 03:21

ockeghemさん、すごい方なんですね... ご回答、きちんと、読ませて頂きたいと思います。
m.ts10806

2019/04/09 03:24

言い方あれですが、そういう方が首を突っ込んでくるほど重要な掲題ということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問