代码之家  ›  专栏  ›  技术社区  ›  Stefano Danieli

\TYPO3\CMS\Extbase\Persistence\Repository和createNamedParameter

  •  0
  • Stefano Danieli  · 技术社区  · 2 年前

    也许这是一个毫无意义的问题。。。但我有点迷路了

    我有自己的扩展,有一个操作->在前端具有“关键字”搜索字段的列表

     <f:form action = "list">
       <f:form.textfield name = "keyword" />
    <f:form submit value "search">
    </f:form>
        
    

    在我的存储库中,我编写了一些代码:

    class MyRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
            {
                public function findByFilters(string $keyword)
                {
                    $query = $this->createQuery();
                    if (isset($keyword) && strlen($keyword) > 0) {
                        $constraints[] = $query->like('nome_corso', '%' . $keyword . '%');
    
                    }
                    /* other constraints[] */
    
                    $query->matching($query->logicalAnd($constraints));
                    $result = $query->execute();
                    return ($result);
    
                }
            }
    

    问题 :现在,我有一个“通配符”$关键字,我想避免sql注入。

    Typo3手册建议放弃单个数据库查询,并采用带有createNamedParameter的QueryBuilder。

    https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/Database/QueryBuilder/Index.html#createnamedparameter

    是否确实有必要放弃从Repository类派生的各个查询数据库,并迁移到QueryBuilder,以避免sql注入,还是可以直接在从Repository类派生的查询对象中设置createNamedParameter?

    0 回复  |  直到 2 年前
        1
  •  3
  •   derhansen    2 年前

    Extbase存储库中类似于描述的查询对于SQL注入是安全的,因为Extbase将查询转换为条令查询,其中使用了带有参数值占位符的预处理语句。看见 Typo3DbQueryParser::convertQueryToDoctrineQueryBuilder() 有关详细信息。

    但是,查询容易受到 SQL Wildcard attacks ,这可能会导致拒绝服务。因此,始终需要确保LIKE查询(Extbase存储库和条令DBAL查询中)中的参数值受到保护,免受SQL通配符攻击。这必须手动完成。

    TYPO3条令QueryBuilder有一个名为 escapeLikeWildcards() (参见 documentation )它必须用于条令查询中的类似查询。对于Extbase存储库,没有可用的助手函数,因此 escapeLikeWildcards() 必须使用手动应用 addcslashes($value, '_%')

    因此,对于Extbase查询约束,SQL通配符攻击预防应如下所示:

    $constraints[] = $query->like('nome_corso', '%' . addcslashes($keyword, '_%') . '%');