XSS対策の htmlspecialchars の付けどころについて質問なのですが
POSTやGETの値をとりあえず最初に全て htmlspecialchars をして変数に入れてから使用しています
しかし最初でなくHTMLなどの出力時に htmlspecialchars をしないとダメだと他サイトでみました
よく分からなかったのですがHTMLなどに出力する最終の時その箇所だけその値に htmlspecialchars をするべきで、面倒なので最初に全てしてから使うと危険なのでしょうか
下記は htmlspecialchars をしなくても安全のようですが
if(isset($_POST["name"]){
下記の様なものは問題があるのでしょうか
$i = "id" . $_POST["name"];
if($i=="id10"){
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
>HTML出力時に入ってきた値がコードだった場合それが機能してしまう以外で
>PHP内で実行されると誤解していました。
なるほど、それはSQLのインジェクションですね
いまはSQLのデータ渡しはPDO経由が主流(?)なので
多少攻撃的なデータでもSQLに致命的な攻撃はしづらくなっています
PHP自体でevalなど非推奨の処理さえしなければ問題ないでしょう
はい
PHP内で実行されてしまうかも、と勘違いしておりました。
SQLの方はPDOを使用して気をつけたいと思います。
有難うございます。
No.4
- 回答日時:
>例えばこちらで変数に入れた値を出力する際もなのでしょうか
変数に代入と、HTML出力の間に他の処理が挟まった場合に、その間に変数の値が安全であり続けるということは自明ではないので、それを保証する必要がありますが、それは面倒ですし、不必要な努力です。
HTML出力時に変換することにしていれば、安全なのは自明で、安全の保証に手間が掛かりません。
「自分が作ったプログラムを自分だけが利用して被害も自分だけが被る」のであれば自分が「このプログラムは安全だ」と確信を持てれば良いので、他人に対して品質保証するということを考えなくてもいいのですが。
HTMLを出力する他にも、
・何らかの理由で動的にSQLを組み立てなければならないケース
・ファイル名を指定してファイルにアクセスするケース
・OSコマンドを実行するケース
・JavaScriptを生成出力するケース
などなど、対処が必要なケースはいくらでもありますが、それぞれそれをする直前にパラメータを変換して無害化するのが正しいやり方です。$_GET/$_POSTを参照する時点で上記すべてへの対処をするのは不可能です。
No.2
- 回答日時:
ひとつは先にhtmlspecialcharsをすると変換後のデータはチェックが煩雑
たとえば受け取ったリクエストの完全一致、部分一致、長さのチェックなど
先にやるほうが処理が多くろくなことがない
(SQLで検索するときなど一致しなくなるし)
<?PHP
$test1=isset($_REQUEST["test1"])?htmlspecialchars($_REQUEST["test1"]):null;
if($test1==htmlspecialchars("<hoge>")){
print "test1 ok";//チェックしたいデータもhtmlspecialcharsしないと一致しない
};
?>
<form>
test1:<input type="text" name="test1" value="<hoge>">
<input type="submit" value="go">
</form>
<?php
$test2=isset($_REQUEST["test2"])?htmlspecialchars($_REQUEST["test2"]):null;
if(preg_match("/&/",$test2)){
print "test2 ok"; //"<"は"<"なので"&"にマッチする
};
?>
<form>
test2:<input type="text" name="test2" value="<">
<input type="submit" value="go">
</form>
もうひとつは、受け取ったリクエストは必ずしも出力するわけではないので
出力しないデータをhtmlspecialcharsすること自体無駄
No.1
- 回答日時:
危険と言うより、htmlspecialcharsは、HTMLとして出力する際に必要な処理なので、他のところで行うと混乱の元です。
バグを生む元になりかねません。$_GETや$_POSTから得たデータだけをhtmlspecialcharsすればいいと思っていませんか?
HTMLとして出力するすべてのデータに対して必要ですよ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPで画像を表示するには?
-
【php】7日おきに日付を表示す...
-
CFileDialogの最初のディレクト...
-
GDへ値を渡す方法は?
-
onedrive にexcelファイルをア...
-
データ送信をボタンを押さずに...
-
10MB以内のJPG画像
-
PHPパーミッションについて
-
youtubeに音声のみのmp4ファイ...
-
.phpファイルが、表示されない
-
画像リストを作りたい
-
phpのPDOの導入
-
PHPから別なPHPへ移動(?)する方法
-
PHPでメールを受信するには?
-
セッションのクッキー有効期間...
-
SEO 動的・静的ページの説明に...
-
【PHP】フレームワークを習得す...
-
違法アップロードについて
-
ssiをhtmlで動作させる為、htac...
-
PHPでSMTPを使ってメール送信で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSV出力にHTMLが入ってしまう
-
webroot以外の画像の表示
-
ob_end_clean と ob_clean の違...
-
リダイレクト元のURLの取得方法...
-
エクスプローラーでフォルダを...
-
PHPで表示したテーブル内容をCS...
-
PHPにおける時間計算、時間足し...
-
PHPで`headers already sent`と...
-
論理演算 NAND に関しての質問
-
PHPの標準入力処理について
-
json_encode日本語表示/PHP5.2.5
-
PHPSpreadsheetによる書き出し...
-
PHPで他のページへジャンプ...
-
mPDFでのPDF出力がうまくいかな...
-
imgタグでのphpの呼び出しについて
-
phpにcssを適応させたい...
-
php にてbatファイルを起動
-
PHP/phpMyAdmin/データベースな...
-
イメージ関数の使い方について
-
【PHP】フォームの reset 時の...
おすすめ情報
>HTMLとして出力する際に必要な処理
有難うございます誤解をしておりました
>出力するすべてのデータに対して必要
入力されるものだけ気をつければ大丈夫と思っていたのですが
下記の様な場合はもちろん駄目でしょうが
$i = こんにちは . $_POST["x"];
echo $i;
例えばこちらで変数に入れた値を出力する際もなのでしょうか
$i=10;
echo $i;
>出力しないデータをhtmlspecialcharsすること自体無駄
有難うございます誤解しておりました
HTML出力時に入ってきた値がコードだった場合それが機能してしまう以外で
PHP内で実行されると誤解していました。
$_POST["x"] = "0 == 0 or 0"
if($_POST["x"] == 1 ){
>変換後のデータはチェックが煩雑
なるほどです