AjaxからPHPにPOSTし、PHPでMySQLにデータ登録をする簡単なコードを作りました。
SQLインジェクションについて調べたりしたのですが、いくつか疑問が出てきたので質問させてもらいます。
こちらのサイトなどを参考にしました。
https://blog.ohgaki.net/complete-sql-injection-counter-measure
コード内容は
ボタンを押したらデータベースに+1カウントされるという内容です。
AjaxでPOSTする内容はデータベースのカラム[インデックス]に対応する固有の数字で、
数字は4桁までを想定しています。
インジェクション対策を2つ作ってみました。
1つ目は受け取った文字列が5文字以上のものをはじきます。
2つ目は文字列の数値化です。数値にならなかったものをはじきます。
疑問
1.AjaxからPOSTされたデータは全て文字列になると思っていますが合っていますか?
2.またその文字列をstrlen()で条件分けするまでに、割り込まれたりするケースはありますか?以下のコードでは変数なども事前に使っていません。
PHP
1<?php 2if($_SERVER["REQUEST_METHOD"] == "POST"){ // postチェック 3 try { 4 $num = $_POST['int1']; // ajaxから受け取った値。4桁以下の数値を想定 5 6 if(strlen($num) < 5){ //対策① 5文字以上を弾く 7 8 $num = $num - 0; // int化 9 if(is_int($num) && $num != 0){ //対策② int化されていたら 10 11 $pdo = new PDO('mysql:host=localhost; dbname=DB; charset=utf8','root','', 12 array(PDO::ATTR_EMULATE_PREPARES => false)); 13 $stmt = $pdo->prepare("SELECT cnt FROM btn where idx = ?"); 14 $stmt->bindValue(1, $num, PDO::PARAM_INT); 15 $stmt->execute(); 16 // postされた数値にあうデータを取得 17 18 $result = $stmt->fetch(); 19 $cnt = $result['cnt']; 20 21 if(is_int($cnt)){ // インクリメントして更新するので一応確認 22 $cnt++; 23 $st = $pdo->prepare("UPDATE btn SET cnt=? WHERE idx=?"); 24 $st->execute(array($cnt, $num)); 25 $pdo = null; 26 $stmt = null; 27 } 28 } 29 } 30 } catch (PDOException $e) { 31 exit('データベース接続失敗。'.$e->getMessage()); 32 die(); 33 } 34 die(); 35} 36?>
PHPの経験が浅いのでコード間違いなどもあれば教えて欲しいです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/09 23:02
退会済みユーザー
2018/01/09 23:21
2018/01/10 18:56