如何使用CakePHP防止参数中的SQL注入

use*_*563 0 php cakephp

使用从用户输入接收的参数时,如何防止在从数据库中获取数据时进行SQL注入:

if(isset($_GET['cityval']) && $_GET['cityval'] !=''){

    $city = $this->request->query('cityval'); 

      $searching .= " and college_city in ($city) ";
    } else {
        $searching .= "";
    }
    if(isset($_GET['scholarship']) && $_GET['scholarship'] !=''){
        $searching .= " and college_scholarship = '".$_GET['scholarship']."' ";
    } else {
        $searching .= "";
    }
Run Code Online (Sandbox Code Playgroud)

我的主要查询如下

$search = $this->Search->query("select * from  colleges where college_id!='' and status='active' $searching order by $order desc limit $start, 10 ");
Run Code Online (Sandbox Code Playgroud)

bur*_*zum 5

开始实际使用框架,或者根本不使用框架。您没有使用请求对象,没有使用ORM,而是在框架上或围绕框架工作。从代码中可以很明显地看出,您不必花时间阅读本手册。

wcomnisky的答案有很多不需要的代码,也不是按预期的方式使用框架的。

如果您想创建一些编写良好的代码,那么您真的应该从做官方文档book.cakephp.org的博客教程开始。如果不停止阅读,请按照wcomniskys的建议去做。它可能有效,但是它不是好的代码,也不是使用框架的正确方法,也不是最简单的解决方案。如果您对正确执行操作不感兴趣,可以立即停止阅读。


您尝试做的显然是通过get参数进行搜索。有一个很棒的插件,使它变得非常简单https://github.com/FriendsOfCake/search

使用插件实际上可能就这么简单:

$query = $this->Colleges->find('search', [
    'search' => $this->request->query
]);
$this->set('results', $this->Paginator->paginate($query));
Run Code Online (Sandbox Code Playgroud)

搜索参数本身将在模型层中处理,请查看插件文档。该框架将负责清理输入。

上面的内容要求您实际上了解框架的基本知识,并且知道自己的工作。如果出于某种原因对不使用框架提供的内容不感兴趣,那么最好根本不使用它,因为这只会堆积无法维护的代码并导致开销。