0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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
4
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
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?