使用PDO创建安全的CRUD类

时间:2012-09-14 05:45:19

标签: php pdo

我创建了一个类来更轻松地处理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 cityaddress FROM users WHERE name LIKE: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";

如果我在数据中添加引号,第二个示例将正常工作,但第一个示例将失败:

// 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损坏,我想念这里。

你能想到别的什么吗?我忘记了什么?我是偏执狂?现在我的脑袋疼得厉害,我不能像人一样思考。

欢迎您的帮助,谢谢

0 个答案:

没有答案