アプリ版:「スタンプのみでお礼する」機能のリリースについて

htmlspecialchars — 特殊文字を HTML エンティティに変換する
ができていない トラブル だと思います。

以下 掲示板 のプログラムです。
keizi_top.php トップ画面 と keizi.php とで 
関連する ファイルは  他にも あるのですが ここで
関連している 2個ファイルのみ記載しました。 
2個ファイルのみでで 結果が 同じでしたので 2個ファイル 
 バク だと 考られます。
さて  
以下の 最初のファイルである keizi_top.php の中に
/*** スレッド名の変数$su_dにデータがあればtbj0に挿入 ***/
$su_d=isset($_GET["su"])? htmlspecialchars($_GET["su"]):null;
ありますが 同ファイルの
<input type="text" name="su" size="50">
の書き込み BOX に 特殊文字 である <  >  & 三種類
試しに 送信しました
結果 以下です。

42 <
2022-04-05 00:35:02作成

43 >
2022-04-05 00:35:09作成

45 &
2022-04-05 00:35:30作成

以上ですが htmlspecialchars が 機能していれば
 < は &lt;
 > は &gt;
 & は &amp;

 に 変換 されるところですが 変換 されずに
そのまま 出てきます。 これだと 攻撃の対象となります。

もしよろしければ MAMP を 使用していますので 
試しに 試験 していただけましたら 助かります。
私の MAMP などに 問題 がある可能性も でてきます。
とりあえず
 以下の プログラムで なにか バグが ありますか?
よろしくお願いいたします。


ファイル名 keizi_top.php
<?php

/*** データベース情報等の読み込み ***/
require_once("data/db_info.php");

/*** データベースへ接続、データベース選択 ***/
$s=new pdo("mysql:host=$SERV;dbname=$DBNM",$USER,$PASS);

/*** タイトル、画像等の表示 ***/
print <<<eot1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SQLカフェのページ</title>
</head>
<body style="background-color:silver">
<img src="pic/jk.gif" alt="女子のイラスト">
<span style="color:purple;font-size:35pt">
SQLカフェ掲示板だよ
</span>

<p>見たいスレッドの番号をクリックしてください</p>
<hr>
<div style="font-size:20pt">(スレッド一覧)</div>
eot1;

/*** クライアントIPアドレス取得 ***/
$ip=getenv("REMOTE_ADDR");

/*** スレッド名の変数$su_dにデータがあればtbj0に挿入 ***/
$su_d=isset($_GET["su"])? htmlspecialchars($_GET["su"]):null;
if($su_d<>""){
$s->query("INSERT INTO tbj0 (sure,niti,aipi) VALUES ('$su_d',now(),'$ip')");
}

$re=$s->query("SELECT * FROM tbj0");
while($kekka=$re->fetch()){
print <<<eot2
<a href="keizi.php?gu=$kekka[0]">$kekka[0] $kekka[1]</a>
<br>
$kekka[2]作成<br><br>
eot2;
}

/*** スレッド作成フォーム、検索ページへのリンク ***/
print <<<eot3
<hr>
<div style="font-size:20pt">(スレッド作成)</div>
新しくスレッドを作るときは、ここでどうぞ!
<br>
<form method="GET" action="keizi_top.php">
新しく作るスレッドのタイトル
<input type="text" name="su" size="50">
<div><input type="submit" value="作成"></div>
</form>
<hr>
<span style="font-size:20pt">(メッセージ検索)</span>
<a href="keizi_search.php">検索するときはここをクリック</a>
<hr>
</body>
</html>
eot3;
?>

質問者からの補足コメント

A 回答 (1件)

よく質問文を読んでいませんが、ブラウザの画面にそう表示されるという話だったら、例えば次のHTMLをブラウザで表示して見たら何が起こっているか気づくでしょう。



ーーーここから
<html>
<body>
&lt;&amp;&gt
</body>
</html>
ーーーここまで
    • good
    • 1
この回答へのお礼

ありがとうございました。
例えば次のHTMLをブラウザで表示して見たら何が起こっている
とりあえずブラウザのソース表示 しました。
<a href="keizi.php?gu=<">42 <
<a href="keizi.php?gu=>">43 >
<a href="keizi.php?gu=&">45 &</a>

しかし >>>>>>>>>>>>>  ですが 13個 入力したところ
<a href="keizi.php?gu=>>>>>>>&amp;g">3 &gt;&gt;&gt;&gt;&gt;&gt;&gt;&amp;g</a>
 最後が & は &amp; に 変換されていますね!
htmlspecialchars — 特殊文字を HTML エンティティには
機能しているみたいです。
文字数が 少なかった のが 原因 だと思います。
さすがに攻撃している側も 1文字では 攻撃できないので
 これでいいのかと思われます。

いろいろ試していたら スレッド 行数が 100行ぐらいなりました
ので mysql テーブル のデータ を 削除クエリで
1度削除しましたので スレッドの 先頭につく数字が 順不同
となりました。

お礼日時:2022/04/06 04:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!