2017-03-07 15 views
1

はサンプルクエリです:PDO :: PARAMを使わずにParamをbindするのは安全ですか?ここ

$sql = $db->prepare("INSERT INTO `accounts` 
    (`id`, `name`, `email`, `phoneNumber`, `country`, `city`, `addrLine1`, `company`, `zipCode`, `sha_pass_hash`, `ClientGroup`, `Newsletter`, `signedIN`) VALUES 
    (NULL, :name, :email, :phoneNumber, :country, :city, :addrLine1, :company, :zipCode, :sha_pass_hash, '1', '1', NOW())"); 
$sql->bindParam(':name',$name); 
$sql->bindParam(':email',$email); 
$sql->bindParam(':phoneNumber',$phoneNumber); 
$sql->bindParam(':country',$country); 
$sql->bindParam(':city',$city); 
$sql->bindParam(':addrLine1',$addrLine1); 
$sql->bindParam(':company',$company); 
$sql->bindParam(':zipCode',$zipCode); 
$sql->bindParam(':sha_pass_hash',$sha_pass_hash); 
$sql->execute(); 

bindParamがPDO::PARAM_STRPDO::PARAM_INTなどのPDO::PARAMが設定されていない使用されたときにあなたが見ることができるように。

私の質問は結局: PDO::PARAMが設定されていない場合、このクエリはSQL Injectionsに対して妥当ですか?

+1

データ型を指定する義務はありません。もし欲しかったらどうぞ。これはセキュリティーには影響を及ぼさず、ステートメントに供給される前に値がどのように変換されるかにのみ影響します。 – tadman

+1

**警告**:独自のアクセス制御レイヤーを作成するのは簡単ではなく、間違った操作をする機会がたくさんあります。 [Laravel](http://laravel.com/)のような最新の[開発フレームワーク](http://codegeekz.com/best-php-frameworks-for-developers/)がある場合は、独自の認証システムを作成しないでください。強力な[認証システム](https://laravel.com/docs/5.4/authentication)が組み込まれています。絶対に[推奨セキュリティベストプラクティス](http://www.phptherightway.com/#security)に従ってください。** SHA1 **のような弱いハッシュでパスワードを保存しないでください。 – tadman

+0

ありがとうございます。私の主な質問は、 'PDO :: PARAMが設定されていないときにSQLインジェクションに対してこのクエリーを実行できるのですか? 'です。 –

答えて

1

これは正しい方法です。便宜のためにPARAM定数がありますので、必要に応じて必要に応じてデータを適切なタイプにキャスト/変換することができます。

非数値データを数値列に挿入するときにエラーを避けるために、数値を整数として使用することがありますが、これらのエラーをキャッチしてレポートする場合は、ここで問題はありません。これは、データを静かにマングリングするよりも優れた解決策です。

+0

非常にありがとう@タドマン –

1

私の意見では、データ型を無視することは全く安全です。変数は参照としてバインドされており、PDOStatement :: execute()が呼び出された時点でのみ評価されるためです。

PDOStatement :: bindParamを使用すると、整数はPDOStatement :: execute()で文字列値に変更されます。 (MySQLでテスト済み)。だから、

私は、クエリを実行するために、以下の使用、そしてこれは私の関数呼び出しの

/** @var string|array $query 
*/ 
public function runQuery($query){ 
    /** @var \PDOStatement $statement 
    */ 
    $result=NULL; 

    $statement=$this->con->prepare(is_array($query)? $query['query']: $query); 

    try 
    { 
     $statement->execute(is_array($query)?$query['param']:null); 
     return $statement; 
    } 
    catch (\Exception $e) 
    { 
     if($e->errorInfo[1]==1062) 
      echo PHP_EOL."Duplicate Entry. Check your unique Entry such as username, ID etc.".PHP_EOL; 
     else if ($e->errorInfo[1]==1146) 
      echo PHP_EOL."Table ".$this->getName()." Not Found".PHP_EOL; 
     else 
      echo $e->getCode().": ".$e->getMessage(); 
     return false; 
    } 
} 

scape Frameworkの一部である、$クエリが動的にフォーマットされたクエリまたは次の形式の配列のいずれかに刺さだろう。

$query= ["query" => $tmpQ, 
     "param" => [$search], 
     ] 
+1

はすばらしく見せますが、常にparamをバインドすることをお勧めします。 –

+0

ありがとうございます。クエリで渡されたデータは事前​​に検証され、フォーマットされています。 –

関連する問題