0

OKここに問題があります:

プロジェクトでデータベース クラスのクエリ関数を作成しようとしていますが、SQL を簡単にエスケープしてデータベースに有害かどうかを確認したいと考えています。

次のようなクエリがあるとします。

INSERT INTO users (id,name,email,username,birthdate)
VALUES(1,'Josh','josh101@coolsite.com','josh101','1978-11-02')

しかし、これを関数にハードコードすると、実際には役に立ちません。それで、挿入したいすべての値に疑問符を使用してから、置き換えたい実際の値を含む関数に配列を渡したとしましょう。

サンプルは次のとおりです。

//Here's the way the function appears in the class definition.
    public function query($sql,$params=array()){

     if (!empty($params) && is_string($sql)):
               //do some stuff here.


            elseif (empty($params) && is_string($sql)):
                //do some other stuff here.

            else:
                //bad sql argument.
                die("Mysql_database ERROR: The query submitted is not a string!");
            endif;

    }

//Here's where the function is applied.
 $sql="INSERT INTO users (id,name,email,username,birthdate)
        VALUES(?,?,?,?,?)";

$params=array(1,'Josh','josh101@coolsite.com','josh101','1978-11-02');

$db= new Mysql_database();

$response=$db->query($sql,$params);

今、私がやりたいことは次のとおりです。

  1. 2 番目の引数が指定されていない場合は、クエリをそのまま実行します。
  2. それ以外の場合は、提供された配列の要素をその型に合わせてチェックし、適切にエスケープしてから、提供された疑似 SQL 文字列の適切な位置に置き換えます。

問題は、すべての疑問符が配列の最初の要素だけに置き換えられているように見えることです。

コードは次のとおりです。

/*assuming I already have a function called create_array that well,
basically creates an array with n elements 
specified in the first parameter and fills each element with the value provided in 
the second parameter.*/
    $toreplace = create_array(substr_count($sql, "?"),"?");
    $sqlComplete = str_replace($toreplace, $params, $sql);

$sqlComplete をエコーすると、次のようになります。

INSERT INTO users (id,name,email,username,birthdate)
VALUES(1,1,1,1,1)

$params の各要素が sql 文字列の適切な位置に配置されるようにするにはどうすればよいですか?

PS: プロジェクトを最初から構築することでここで少し挑戦しようとしているので、単に codeigniter を使用するように言わないでください。仕事を成し遂げるためにフレームワークに常に依存したくはありません。

4

2 に答える 2

2

多分MySQLの準備されたステートメントを使用するだけですか?

于 2012-11-27T09:24:11.603 に答える
1

次のように実行できます。

$params=array(1,'Josh','josh101@coolsite.com','josh101','1978-11-02');

$sql="INSERT INTO users (id,name,email,username,birthdate)
    VALUES(?,?,?,?,?)";

foreach($params as $param)
{
    $pos = strpos($sql, '?');

    if($pos !== false)
    {
        $sql = substr_replace($sql,"'" . $param . "'",$pos,1);
    }
}

echo $sql;

出力

INSERT INTO users (id,name,email,username,birthdate) VALUES('1','Josh','josh101@coolsite.com','josh101','1978-11-02')

これはエスケープを行わず、クエリに値を入力するだけです。フレームワーク/DB API に適したエスケープを追加する必要があります。

于 2012-11-27T09:25:35.920 に答える