プロが教える店舗&オフィスのセキュリティ対策術

部分的なプログラムは以下です。
/** スレッド名の変数$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')");
}
 ②if($su_d<>"")
*************************

以上で質問があります。
 ①t($_GET["su"])? に テスト と言う 文字列が送信された場合 ②が受け取る。

受け取った②は 
②if($su_d<>"")→「テスト<>""」で<>"" の比較演算子で 空文字ではない と判断
した場合   $s->query("・・・ 送られ 処理される。
と 流れはわかります。
私的に ①が②を判断しているように見れます。なので②は不要だと思われます。
 
私は実戦経験がないので 素人目線 でしか ものを言えないのですが 理解に苦しん
でいます。
そうなっているから そうなんだ と 覚えてもいいのですが 何か気になります。

あえいて if($su_d<>"") を 設けないと いけない理由 なんでしょうか?
 
以上よろしくお願いいたします
    
以下は 以上の全体のプログラムです。
ファイル名[keizi_top.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件)

$su_d=isset($_GET["su"])? htmlspecialchars($_GET["su"]):null;


上記の意味は
$_GET["su"]に値が設定されていれば、それを特殊文字をHTMLエンティティに変換し、$su_dに設定する。
$_GET["su"]に値が設定されていなければ、nullを$su_dに設定する。
になります。

従って、
if($su_d<>""){
}
で判断しているのは、nullが設定されたケースをはじく為です。
($_GET["su"]に値が設定されていないケースをはじく為です)

では、そもそも、
$su_d=isset($_GET["su"])? htmlspecialchars($_GET["su"]):null;
を実行した時点で、$_GET["su"]に値が設定されていないケースがあるかということになりますが、
この作者は、そのケースがあると判断したと思われます。

私も、phpでの実戦経験がない為、そのケースがあるかどうかはわかりません。

「テスト と言う 文字列が送信された場合」はそうなりますが、
空文字が送信された場合もありうると作者は、判断したのではないでしょうか。
    • good
    • 2
この回答へのお礼

詳しくご回答くださいまして ありがとうございました。
流れ的なことが 詳しくわかりました。
htmlspecialchars — 特殊文字を HTML エンティティに変換する
ですね 

 あと isset も ありますので 変数がセットされている
かの判断 もしているので 複雑ですが ここでは 

Aンス:空文字が送信された場合もありうる ~ですが
試しに スペースの 数個 入れただけの いわゆる
ここで言う 空文字 でしょうか ね 
入れて 送信したところ ちゃんと (スレッド一覧)
に 表示されてしまいました。

以下
8 が 大文字 スペースを 数個 入れて送信
9 が 小文字 スペースを 数個 入れて送信 

これって どうなんでしょうか? 
 if($su_d<>"") で判断 した場合 空白を 文字 と
判断 しているので 機能して いない のではないでしょうかね?

以下(スレッド一覧)です。
--------------------------------------
8    
2022-03-26 17:01:12作成

9
2022-03-26 17:01:42作成

お礼日時:2022/03/26 17:17

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