2016-06-30 7 views
0

私は奇妙な問題を抱えています...コード化されたSQLインジェクションを防ぐためにパラメータ化されたクエリを使用していますが、その動作の一部に問題があり、その周りの私の仕事は、パラメタリゼーションの目的を打ち負かしています。NULL値でパラメータ化されたクエリを使用する

は、私はこのクエリを作ってるんだと仮定します。

$db = new csmysqli('database',$host,$user,$pass); 
$value = x; 
$stmt = "INSERT INTO table SET value='%s'"; 
$result = $db->prepare($stmt, $value); 
echo $result; 

さてここで問題ません... xは結果の文字列、または私たちはこれを取得int型の場合:

INSERT INTO table SET value='123'; 

問題ありません...しかし、xがnullの場合:

INSERT INTO table SET value='NULL'; < ---そこに単一引用符が問題を引き起こす.... [OK]をので、私はそれを回避するために、これを試してみてください。

$value = "'x'"; // Notice the quotes now go around x 
$stmt = "INSERT INTO table SET value=%s"; 
$result = $db->prepare($stmt, $value); 
echo $result; 

そしてxは整数や文字列であれば、私たちはこれを取得:

INSERT INTO table SET value=\'x\'; 

そしてnullが機能するようになりました:

INSERT INTO table SET value=NULL; 

そこで質問です:

どのようにすることができます正常なデータとNULLデータの両方を取得して、正しくパラメータ化する

EDIT:

私は特別なmysqli_helperスクリプトを使用しています言及している必要があります。

class csmysqli extends mysqli 
{ 
    public function __construct($dbname = '', $host,$user,$pass) 
    { 
     parent::__construct($host, $user, $pass, $dbname); 
    } 

    public function query($query) 
    { 
     $numParams = func_num_args(); 
     $params = func_get_args(); 

     //merge in parameters only if needed 
     if ($numParams > 1) { 
      for ($i = 1; $i < $numParams; $i++) { 
       $params[$i] = parent::real_escape_string($params[$i]); 
      } 

      $query = call_user_func_array('sprintf', $params); 
     } 

     return parent::query($query, MYSQLI_STORE_RESULT); 
    } 

    public function prepare($query) 
    { 
     $numParams = func_num_args(); 
     $params = func_get_args(); 

     //merge in parameters only if needed 
     if ($numParams > 1) { 
      for ($i = 1; $i < $numParams; $i++) { 
       $params[$i] = parent::real_escape_string($params[$i]); 
      } 

      $query = call_user_func_array('sprintf', $params); 
     } 

     return $query; 
    } 
} 
+1

そのコードはうまくいかないはずです。 '$ db-> prepare($ stmt、$ value);' [mysqli :: prepare](http://php.net/manual/en/mysqli.prepare.php ) – FirstOne

+1

メモ:準備された文章を使うときは、テーブルに文字列として挿入しない限り引用符を使用しないでください。 – FirstOne

+1

これは通常、mysqliを使って文を準備する方法ではありません。私はhttp://php.net/manual/en/mysqli.prepare.phpを閲覧することをお勧めします。あなたは値のプレースホルダとして '?'を使用しなければなりません。そして 'bind_param'関数を使って型と値を指定します。それはあなたのための一重引用符を処理する必要があります。そしてヌル値も私は信じています。 – kunruh

答えて

0

ネイティブmysqliののパラメータで正しく取り込むために、通常のデータとNULLデータの両方を取得するには問題はありません。

自家製のパラメータ設定では、パラメータの種類を確認してそれに応じて動作させる必要があります。

+0

うん、私はうんざりしている、私の会社は、この自家製のパラメータ設定は編集できません。 – ajax1515

+0

あなたは上司にこのアプローチが本質的にSQLインジェクションに対して脆弱であると説明することができますか?あなたは私の連絡先を与えることができ、私はそれらの脆弱性を実証します。 –

関連する問題