0

CRUDをより簡単に処理するためのクラスを作成しましたが、問題が発生しました。私の現在のクラスは、次の構文でクラッドを実行します。

$crud = Core::Db()->builder();
$userData =$crud
                ->select("city,adress")
                ->from('users')
                ->where('name')
                ->like(':name')
                ->read(array(':name','%stefan'));

crudメソッドを呼び出すと、SQLセンテンスが自動的に作成され、プライベート変数$this->sqlに挿入されます。write()はデータを準備し、準備されたステートメントをバインドします(存在する場合)。

最後の例では、次のSQLが生成されます。

$ this-sql = "SELECT cityaddressFROM usersWHERE nameLIKE:name";

すべてが完璧に機能します。:nameをバインドし、「%stefan」を追加します。大丈夫。

これが私の問題です。追加した場合:

$userData =$crud
                ->select("city,adress")
                ->from('users')
                ->where('name')
                ->like('%stefan')
                ->read();

戻り値 :

//bad syntax
$this->sql = "SELECT `city`,`address` FROM `users` WHERE `name` LIKE %stefan";

データに引用符を追加すると、2番目の例は正常に機能しますが、最初の例は失敗します。

// First example, bad sintax
$this-sql = "SELECT `city`,`address` FROM `users` WHERE `name` LIKE ':name'"; 

// Second example, good
$this-sql = "SELECT `city`,`address` FROM `users` WHERE `name` LIKE '%stefan' ";  

私は解決策を考えていました...like()メソッド呼び出しに引用符を追加し、名前がwrite()でバインドされたバインドされたパラメーターの名前と等しい場合はストライプします。

private function write(array $input_parameters=array(),$style=NULL)
{
  // clean possible errors in holders
  foreach($input_parameters as $key => $value):
      if(strpos($this->sql,"'".$key."'") !== FALSE)
      $this->sql = str_replace("'".$key."'",$key,$this->sql);
      if(strpos($this->sql,'"'.$key.'"') !== FALSE)
          $this->sql = str_replace('"'.$key.'"',$key,$this->sql);
  endforeach;

  // .... code ....//
}

この場合、このソリューションは正常に機能しますが、次のようなものがある場合:

$userData =$crud
                ->select("id")
                ->from('blog')
                ->where('content')
                ->like(':word')
                ->_or('something')
                ->like(':word')
                ->read(array(':word','something'));

戻り値:

$this->sql = "SELECT `id` FROM `blog` WHERE `name` LIKE :word or `something` LIKE :word "; 

これは実際の例ではありませんが、それが悪い解決策であると私が考える理由を示すためだけに、セキュリティリスクになる可能性があります。

安全な問題や破損したSQLなしでデータをバインドする方法を見つけることができません。ここで何かが恋しいです。

他に何か考えられますか?何か忘れた?私はパラノイアですか?今、頭がとても痛くて、人間のようには思えません。

あなたの助けは大歓迎です、ありがとう

4

0 に答える 0