セキュリティ対策
・バリデーション(データがバリッドかインバリッドか)
・サニタイズ処理(無害化)
PDOが担っているのが「サニタイズ」
メインの理由はSQLインジェクション
受け取った文のなかにSQL文があると危なっかしい
SQL文込みでなにか送るとなるともっと危なっかしい
→サニタイズする必要がある
しかもすり抜ける方もいろいろやるので
文字コードをアラビア文字にするとかいろんな思いもつかない方法でやってくる
→
もう個人で対応するものじゃないよね
→
PHPのバージョンが急遽挙げられて、PDOオブジェクトが加わった
PDO自体がサニタイズのためにあるといっていい
攻撃者はprepareをとりわけ使いたい
prepareで生成されるSQL文
平文のSQL文をprepareすると、
プリペアドステートメントになる
構文としてプリペアする。データを入れる前にいったんコンパイルする、らしい。
SQLの構文だけをコンパイルする。0と1だけになる。
そこに普通文字情報が混じるわけがない。
そこにバインドしようという発想だとかなんとか。
prepareを使わないとPDOの意味がないらしい
混ざるおそれがないものはクエリーメソッドですむらしい
小麦粉を練ってるときにどくがまじるとやばい
先にパンを焼いておけばいい
パンに穴をあけておいてトッピング(値)をあとでバインド(あなぽこにはめる)をすれば良い
複数あなぽこがほしいときはコロンをつければ穴ぽこが複数だなととられる
あなぽこをカッコよく言うと「プレースホルダ」と呼ばれる
プレースホルダ(名前付きの穴)にしたうえで事前コンパイルをする
セキュリティを無視するなら2行ですむが、
SQLインジェクションを回避するために
これらを長く記述する必要がある
なお、いまのコードだと登録の後真っ白画面になる
処理をする画面に滞留してはいけないという規則がある
students_form.php
→insert_s.php
ここで処理が終わったら即座にリダイレクトしたい
header関数を使う
ロケーションの冒頭は大文字でLocationでないといけない
コロンの後、
必ず半角スペースをいれる。
header("Location: students_form.php");
正しくは相対パスまたは絶対パスでファイル名を記す
とりあえずほかにページがないので、元のページに戻るようにしましょう
まるで何も起こらなかったように見えるが、
dbをみると登録されている
--->insert_s.php
<?php
//var_dump($_POST);
//print_r($_POST);
//echo $_POST["s_name"];
//-------------------------
//DBへの接続情報
//環境に応じて書き換えてください
//-------------------------
$user = "root";
$pass = "";
$host = "localhost";
$dbname="school";
//-------------------------
$dsn = "mysql:host={$host};dbname={$dbname};charset=utf8";
$pdo= new PDO($dsn, $user, $pass);
$sql="INSERT INTO students(s_name) VALUES (:s_name)";
//$pdo->prepare($sql);//上の一行をプリコンパイルする//穴だけあけて生地を用意した
$stmt = $pdo->prepare($sql);//パン生地を焼いた(コンパイル済みのバイナリデータになっている)
$stmt->bindValue(":s_name",$_POST["s_name"],PDO::PARAM_STR); //(バイナリデータとテキストデータが混じることはないので毒があっても回らない)
//$pdo->query($sql);//これはもう使えないので、
$stmt->execute();//実行
header("Location: students_form.php");
?>
次にselectの処理をさせる
--->students_list.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>生徒一覧</title>
<link rel="stylesheet" href="css/style.css">
<script src="../jquery-3.4.1.min.js"></script>
</head>
<body>
<h1>登録済み生徒一覧</h1>
<div id="container">
<table>
<tr>
<th>ID</th><th>生徒氏名</th>
</tr>
</table>
</div>
<script src="js/list.js"></script>
</body>
</html>
--->list.js
$(function(){
console.log("hogehoge");
});