読者です 読者をやめる 読者になる 読者になる

ハロトレWebデザインの勉強 | 求職者支援訓練Webサイト制作科 フェリカテクニカルアカデミー

未経験者からプロになるハロートレーニングWebデザインの勉強

お問い合わせ:データベース(5)

お問い合わせ登録データを検索


《search.html》

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>検索</title>
<link href="style.css" rel="stylesheet" media="all">
</head>
<body>
<p>ご意見コードを入力してください。</p>
<form action="search.php" method="post" id="search">
<input type="text" name="code" size="20" id="code">
<br>
<input type="submit" value="検索">
</form>
</body>
</html>




《search.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>検索画面</title>
<link href="style.css" rel="stylesheet" media="all">
</head>
<body>
<?php
 $code = $_POST['code'];

 $dsn = 'mysql:dbname=サーバー名;host=ホスト名';
 $user = 'ユーザー名';
 $password = 'パスワード';
 $dbh = new PDO($dsn, $user, $password);
 $dbh -> query('SET NAMES UTF8');
	
 $sql = 'SELECT * FROM inquiry WHERE code='.$code;
 $stmt = $dbh -> prepare($sql);
 $stmt -> execute();

 while(1) {
   $rec = $stmt -> fetch(PDO::FETCH_ASSOC);
   if($rec == false) {
        break;
   }
			
  print $rec['code'].':&nbsp;';
  print $rec['name'].':&nbsp;';
  print $rec['email'].':&nbsp;';
  print $rec['message'];
  print '<br>';
	}
	
 $dbh = null;
?>
</body>
</html>



SQLインジェクション

 $sql = 'SELECT * FROM inquiry WHERE code=2 or 1;


この場合、「or 1」が「もしくは全部」という意味に解釈されます。
Webサイトの構造によっては個人情報をもっていかれてしまいます。


SQLインジェクションを防ぐ


変数の連結をやめて、データを入れたい部分を「?」で表現

$sql = 'SELECT * FROM inquiry WHERE code=?';


データは別の変数に格納

$data = $code;


SQL文で命令をだすときに、データを格納した変数を指定

$stmt -> execute($data);

《search.php

 $sql = 'SELECT * FROM inquiry WHERE code=?';
 $stmt = $dbh -> prepare($sql);
 $data[] = $code;
 $stmt -> execute($data);
プリペアードステートメントで複数データを扱う
  • 複数が一致しないと表示させない


《search.php

 $sql = 'SELECT * FROM inquiry WHERE code=? AND name=?';
 $stmt = $dbh -> prepare($sql);
 $data[] = $code;
 $data[] = $name;
 $stmt -> execute($data);


※nameの部分はフィールド名を入力します。


複数のうちどちらかのデータを扱う
  • 入力フィールドの「name属性」「id属性」を個別に設定する
<ul>
<li>コード番号を入力します:<input type="text" name="code" size="20" id="code"></li>
<li>名前をを入力します:<input type="text" name="name" size="20" id="name"></li>
</ul>


《search.php

 $code = $_POST['code'];
 $name = $_POST['name'];

・・・・中略

 $sql = 'SELECT * FROM inquiry WHERE code=? OR name=?';
 $stmt = $dbh -> prepare($sql);
 $data[] = $code;
 $data[] = $name;
 $stmt -> execute($data);
phpMyAdmin内を検索




個人情報のディレクトリを検索対象から除く

  • 検索画面を管理者のみが利用するか、閲覧者にも利用してもらうかにより設定方法は変わります
.htaccess」ファイルを使う

特にトップページのようなものが存在しない場合は、 ディレクトリ内の一覧が表示されてしまいます。


サーバがApacheだった場合

  • .htaccessファイルを使って、ファイル中に



 Options -Indexes


と記述しておけば、ディレクトリ内のファイル一覧が表示されるのを防げます。 ブラウザには、403 Forbidden のエラーメッセージが表示されます。

間にクッションを置く

例えば、次のようなディレクトリ構造だったとします。

  


「private 」と「work」の2つのディレクトリを秘密にしておきたいとすると、robots.txt には、次のように記述することになります。



 User-Agent: *
 Disallow: /private/
 Disallow: /work/


これだと「private 」と「work」がディレクトリが存在することが分かってしまいます。


そこで、ディレクトリ構造を、次のように変えます。

  


これなら「secrets」ディレクトリだけを隠せば良いので、robots.txt は、次のようになります。



 User-Agent: *
 Disallow: /secrets/


secrets ディレクトリには、ダミーの index.html ファイルを置いておくなどして、ディレクトリの中身が見えないようにしておきます。