避免字符串连接以创建查询

时间:2015-02-12 09:14:17

标签: sql

Martin Fowler在他的书 企业应用程序架构模式 中说

  

一个好的经验法则是避免将字符串连接放在一起   SQL查询

我经常使用这种做法,从查询的真实data中抽象出我的SQL查询的语法。

你能解释一下为什么这被认为是一种不好的做法吗?

1 个答案:

答案 0 :(得分:8)

虽然在编译之前可能存在使用字符串连接构建预准备语句的用例,但使用字符串连接插入查询参数总是不好的做法有两个原因:

  1. 性能:使用预准备语句时,必须仅解析一次查询语法,并且必须为每个不同的查询类型仅计算一次访问路径。通过字符串连接构建语句时,必须为查询的每次执行完成解析和优化。
  2. 安全性:对用户提供的数据使用字符串连接总是容易发生SQL注入攻击。假设你有一个声明:

    query = "select secret_data from users where userid = '" + userid_param + "'";  
    
  3. 想象有人发送userid_param包含"' OR 1=1;" ...

    这样,防守的唯一方法就是100%正确的输入卫生,根据使用的语言,可能很难做到正确。当使用带有正确实现的驱动程序的预准备语句时,驱动程序将从查询参数中隔离语句,这样就不会混淆任何内容。