mixiユーザー(id:2089365)

2019年06月12日06:11

132 view

【PHP】タグ無効化

取り合えず自分で文字列送信する分には、意図しない限りは
余程奇跡的な確率がなければ「悪意あるタグ」なんて入力しないから
前に作ったプログラムでも大丈夫だろうけど、
公開して第3者も使用できるようなものならば、「悪意あるタグ」対策
しないといけない。

取り合えず自らやばいのを入力するのもばからしい
(そもそも大して知識もない)ので、タグの送信ってのがどうなるか
大して影響ないものでやってみる。
https://mixi.jp/view_diary.pl?id=1971858331&owner_id=2089365
で、作ったphpファイルで、
<body bgcolor=red>を入力して、送信ボタンを押下。
テキストボックス下の文字列は「ゲソ」とだけ表示で、
背景が赤くなる。
ソースでは<body>タグが2つあるのは文法上間違ってはいるが、
残念ながら動作してしまい、背景を赤くしてしまう。

上記のは、まだ自分だけで実行する環境だし、やってることも
背景色変えてるだけだからいいが、もっとやばいこともできるらしいので、
タグを無効化させる。
<?php〜?>内を修正する。(上手く表示できないので、?php前の<は全角)

<?php
$mozi=htmlspecialchars($_GET["a"],ENT_QUOTES);
print isset($_GET["a"])?$mozi."ゲソ":"何か言わなイカ!";
?>

これで、改めて<body bgcolor=red>を入力して、送信ボタンを押下。
今度は、「<body bgcolor=red>ゲソ」と表示されて背景は白いまま。
htmlspecialchars関数によって、「<」「>」等が別の文字列に変換され、
それをHTMLでは、再度「<」「>」として表示する。
・・・「それは表示できない」的なエラーにはしないんだな。
ちなみに、ENT_QUOTESは「'」も変換する場合に指定している。
・・・「'」を変換しなくてもいい場合ってのもあるのかな?

これで大分プログラムとしてできあがったかと安心してたら、
何も入力せずに送信した場合の表示も考えなければいけないとのこと。
このままだと「ゲソ」だけだが、最初に開いた状態と同じようにすべき
らしい。
・・・どっちでもいい気がしないでもないが、何も言ってないのに
対して、「何か言わなイカ!」と返されるのは正しいとも思えるので、
やってみる。
$_GET["a"]が存在するisset($_GET["a"])だけでなく、
$_GET["a"]が空であるかも条件に必要なわけだ。
と言っても、存在して且つ空でなければ、「〜ゲソ」を返し、
それ以外は「何か言わなイカ!」と返せばいい。
三項演算子の部分に、条件追加の&&演算子を使う。

print isset($_GET["a"])&&$_GET["a"]!=""?$mozi."ゲソ":"何か言わなイカ!";

これで、$_GET["a"]!=""
つまり、$_GET["a"]が空でないことが条件に追加される。

改めて何か文字列を入力し、送信ボタンを押下して、「〜ゲソ」
と表示させた後に、今度は何も入力せずに送信ボタンを押下すると、
「何か言わなイカ!」と返される。
・・・ページを開いて最初に何も入力せずに、送信ボタンを押下でも、
URLが「〜.php?a=」で、「何か言わなイカ!」とは表示されるものの、
1回別のが表示されてからの方がわかりやすいと感じてやってみた。
0 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する

<2019年06月>
      1
2345678
9101112131415
16171819202122
23242526272829
30      

最近の日記

もっと見る