如何执行类似查询Typeorm

Gar*_*ezi 11 javascript typescript typeorm

大家好我正试图找到所有结果.我尝试过几种方法,但问题无关紧要.它只返回一个空数组

  var data = await  getRepository(User)
                        .createQueryBuilder("user")
                        .where("user.firstName = %:name%", {name: firstName })
                .getMany();
Run Code Online (Sandbox Code Playgroud)

和这样的事情

 var data = await  getRepository(User)
                            .createQueryBuilder("user")
                            .where("user.firstName like %:name%", {name: firstName })
                    .getMany();
Run Code Online (Sandbox Code Playgroud)

但没有任何工作.所有这些都给我一个空数组.有人可以帮我谢谢

ple*_*ock 20

正确的方法是:

 var data = await getRepository(User)
                  .createQueryBuilder("user")
                  .where("user.firstName like :name", {name: '%' + firstName + '%' })
                  .getMany();
Run Code Online (Sandbox Code Playgroud)

  • SQL注入!!! (8认同)
  • 这样可以正确地逃脱`firstName`吗? (2认同)

Gab*_*upu 11

TypeORM提供开箱即用的Like功能。他们的文档中的示例

import {Like} from "typeorm";

const loadedPosts = await connection.getRepository(Post).find({
    title: Like("%out #%")
});
Run Code Online (Sandbox Code Playgroud)

在您的情况下:

var data = await getRepository(User).find({
    name: Like(`%${firstName}%`)
});
Run Code Online (Sandbox Code Playgroud)

  • 如果你像我一样来这里寻找“ilike”,它似乎会在即将发布的版本中出现:https://github.com/typeorm/typeorm/pull/5828 (3认同)
  • 如果“firstName”不是安全值,则您的解决方案无法防止 SQL 注入 (3认同)
  • @LucaRoverelli 如何使其免受 sql 注入的影响?是否可以使用相同的语法? (2认同)

小智 8

您还可以使用数据库函数进行串联。以 postgres 为例:

 var data = await getRepository(User)
              .createQueryBuilder("user")
              .where("user.firstName like '%' || :name || '%'", {name: firstName })
              .getMany();
Run Code Online (Sandbox Code Playgroud)


小智 7

似乎截至撰写本文时的所有答案(包括pleerock接受的答案)都容易受到 SQL 注入的攻击,除非用户输入已事先经过清理。

 var data = await getRepository(User)
              .createQueryBuilder("user")
              .where("user.firstName like :name", { name:`%${firstName}%`})
              .getMany();
Run Code Online (Sandbox Code Playgroud)

事实上,上述代码在 TypeORM 中有效,因此这种风格的任何查询都容易受到数据泄露的影响。想象以下类似的查询:

 const data = await getRepository(User)
          .createQueryBuilder("user")
          .where("user.firstName like :name", { name: firstName })
          .getOne();
Run Code Online (Sandbox Code Playgroud)

来自包含上述查询(例如)中%发送的字符的用户的未经净化的数据将允许用户泄露有关其他用户的潜在隐私数据。firstNamelet firstName = '%John'

因此,在用例允许的情况下,应确保对所有用户输入进行清理并删除所有特殊字符。

或者,在 MySQL 中,用例要求文本中存在特殊字符,全文搜索可能更合适。然而,这维护起来更加昂贵。

在相关列上创建全文搜索并执行查询

    export class User {
        @PrimaryGeneratedColumn()
        id: number;

        @Index({fulltext: true})
        @Column()
        name: string;
    }

    const data = await this.repository
         .createQueryBuilder()
         .select()
         .where('MATCH(name) AGAINST (:name IN BOOLEAN MODE)', {name: name})
         .getOne()
Run Code Online (Sandbox Code Playgroud)