LoginSignup
0
3

More than 5 years have passed since last update.

SQLインジェクション対策(PHP)

Last updated at Posted at 2016-11-23

■PHP(PDO)

基本的なルールは以下参照

PHPでのSQLインジェクション対策はどのように行いますか?

bindParamで入力値をエスケープする際に使う定義済み定数

スクリーンショット 2016-11-22 20.25.50.png

(出典) http://php.net/manual/ja/pdo.constants.php

bindParamする型がfloatの場合

(問題) PDO::PARAM_FLOATがない

上述のが画像を見ると見事に「PDO::PARAM_FLOAT」が存在しない。
例えば、 UPDATE tableName SET kawase = $usdjpy に
$usdjpy = 101.10 をあてはめたい場合はどうすればいいか?

(対策)PDO::PARAM_STR を利用すればOK。

PDO::PARAM_STRでbindすれば問題ない。
MySQLの動作しか確かめていないが、
例えば、 UPDATE tableName SET kawase = '101.10'となっても、
MySQL側でFLOAT型と判断して、計算してくれる。

同様に、「UPDATE tableName SET usdPrice = 10000/$usdjpy 」
のような場合でも、PDO::PARAM_STRでbindしても、
「UPDATE tableName SET usdPrice = 10000/'101.10' 」

「UPDATE tableName SET usdPrice = 10000/101.10 」
と読み替えてくれる。

実際に作成した関数

$params = array(
array($name, PDO::PARAM_STR),
array($email, PDO::PARAM_STR),
);

function select_InjectionSafe($sql,$params = array() ){

  $stmt = $this->pdo->prepare($sql);

  if(count($params) > 0){
    for($i=0;$i < count($params);$i++){
      $stmt -> bindParam($i+1,$params[$i][0],$params[$i][1]);
    }
  }
  $stmt->execute();
  return ...
}
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3