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で質問しましょう!
似たような質問が見つかりました
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP 書籍よりも より良い htmlspecialchars の変更を 1 2022/04/18 02:28
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP if($se_d<>"")の””意味と教えてください。 1 2022/05/12 23:05
- PHP isset — 変数が宣言されていること、そして null とは異なることを検査 1 2022/03/27 17:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CSV出力にHTMLが入ってしまう
-
TCPDFについて
-
ob_end_clean と ob_clean の違...
-
PHPSpreadsheetによる書き出し...
-
JSON_UNESCAPED_UNICODEをつけ...
-
FTPコマンドでディレクトリごと...
-
onedrive にexcelファイルをア...
-
バッチを用いたフォルダの自動移動
-
PHPのif文でその処理を途中で抜...
-
これの対応OSを教えて下さい。p...
-
PHPでネットワークドライブのop...
-
PHPsendmailにて送信元を変更
-
phpでクラスのメソッドで同名の...
-
PEAR Image_QRCodeのエラー
-
PHPでfatal errorが出ても無視...
-
【WordPress】メディアの一覧出力
-
さくらサーバーにて、phpからメ...
-
ListViewコントロールでサムネ...
-
phpのクラスメソッドの定義が長...
-
php 完了画面の送信メールのコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CSV出力にHTMLが入ってしまう
-
文字列を段落で分ける方法を教...
-
PHPSpreadsheetによる書き出し...
-
imgタグでのphpの呼び出しについて
-
phpにcssを適応させたい...
-
分割して出力する方法
-
エクスプローラーでフォルダを...
-
PHPで取得したHTML内のdiv要素...
-
htmlspecialcharsの付けどころ...
-
ob_end_clean と ob_clean の違...
-
PHPで`headers already sent`と...
-
「タブ」記号を表すエスケープ...
-
画像をDBに保存し、表示させ...
-
webroot以外の画像の表示
-
PHPにおける時間計算、時間足し...
-
phpで別の場所にある画像への相...
-
リダイレクト元のURLの取得方法...
-
¥マークを出力したいがバック...
-
smarty foreach 半角スペース
-
PHPでデータベースからデータを...
おすすめ情報
>HTMLとして出力する際に必要な処理
有難うございます誤解をしておりました
>出力するすべてのデータに対して必要
入力されるものだけ気をつければ大丈夫と思っていたのですが
下記の様な場合はもちろん駄目でしょうが
$i = こんにちは . $_POST["x"];
echo $i;
例えばこちらで変数に入れた値を出力する際もなのでしょうか
$i=10;
echo $i;
>出力しないデータをhtmlspecialcharsすること自体無駄
有難うございます誤解しておりました
HTML出力時に入ってきた値がコードだった場合それが機能してしまう以外で
PHP内で実行されると誤解していました。
$_POST["x"] = "0 == 0 or 0"
if($_POST["x"] == 1 ){
>変換後のデータはチェックが煩雑
なるほどです