在Nodejs中编写原始sql查询是一个好习惯吗?

时间:2018-05-21 10:51:42

标签: mysql node.js

原始sql查询,如:

var sql = "update node SET changed = " + params.updationTime + " where nid = " + params.nid

是否建议在.js文件中编写原始sql查询?我们是否容易进行任何SQL注入?或者更好地使用Knex.js等库?

4 个答案:

答案 0 :(得分:0)

对于node和mysql,

Sequelize是很好的ORM。但是,如果某个应用需要一个或两个查询,您可以转义变量。 此外,模板文字变量将比旧的字符串连接方法更清晰。

018/05/21 09:12:56 INFO  - jmeter.engine.StandardJMeterEngine: Running the test! 
2018/05/21 09:12:56 INFO  - jmeter.samplers.SampleEvent: List of sample_variables: [] 
2018/05/21 09:12:56 INFO  - jmeter.samplers.SampleEvent: List of sample_variables: [] 
2018/05/21 09:12:56 INFO  - jmeter.config.KeystoreConfig: Configuring Keystore with (preload:True, startIndex:0, endIndex:1, clientCertAliasVarName:'key1') 
2018/05/21 09:12:56 INFO  - jmeter.util.JsseSSLManager: Using default SSL protocol: TLS 
2018/05/21 09:12:56 INFO  - jmeter.util.JsseSSLManager: SSL session context: per-thread 
2018/05/21 09:12:56 INFO  - jmeter.util.SSLManager: JmeterKeyStore Location: C:/Jmeter/Jmeter-3.0.0/certificates/01012018b.p12 type pkcs12 
2018/05/21 09:12:56 INFO  - jmeter.util.SSLManager: KeyStore created OK 
2018/05/21 09:12:56 WARN  - jmeter.util.keystore.JmeterKeyStore: Did not find all requested aliases. Start=0, end=1, found=1 
2018/05/21 09:12:56 INFO  - jmeter.util.SSLManager: Total of 1 aliases loaded OK from keystore 
2018/05/21 09:12:56 INFO  - jmeter.gui.util.JMeterMenuBar: setRunning(true,*local*) 
2018/05/21 09:12:56 INFO  - jmeter.engine.StandardJMeterEngine: Starting ThreadGroup: 1 : Thread Group 
2018/05/21 09:12:56 INFO  - jmeter.engine.StandardJMeterEngine: Starting 2 threads for group Thread Group. 
2018/05/21 09:12:56 INFO  - jmeter.engine.StandardJMeterEngine: Thread will continue on error 
2018/05/21 09:12:56 INFO  - jmeter.threads.ThreadGroup: Starting thread group number 1 threads 2 ramp-up 0 perThread 0.0 delayedStart=false 
2018/05/21 09:12:56 INFO  - jmeter.threads.ThreadGroup: Started thread group number 1 
2018/05/21 09:12:56 INFO  - jmeter.engine.StandardJMeterEngine: All thread groups have been started 
2018/05/21 09:12:56 INFO  - jmeter.threads.JMeterThread: Thread started: Thread Group 1-1 
2018/05/21 09:12:56 INFO  - jmeter.threads.JMeterThread: Thread started: Thread Group 1-2 
2018/05/21 09:12:56 INFO  - jmeter.services.FileServer: Stored: NGDA_new.csv 
2018/05/21 09:12:56 INFO  - jmeter.protocol.http.sampler.HTTPHCAbstractImpl: Local host = rm101jmp01 
2018/05/21 09:12:56 INFO  - jmeter.protocol.http.sampler.HTTPHC4Impl: HTTP request retry count = 0 
2018/05/21 09:12:58 INFO  - jmeter.services.FileServer: Stored: keystoreFile.csv 
2018/05/21 09:12:58 INFO  - jmeter.protocol.http.sampler.HTTPHC3Impl: HTTP request retry count = 0 
2018/05/21 09:12:58 INFO  - jmeter.threads.JMeterThread: Thread is done: Thread Group 1-1 
2018/05/21 09:12:58 INFO  - jmeter.threads.JMeterThread: Thread finished: Thread Group 1-1 
2018/05/21 09:12:58 INFO  - jmeter.threads.JMeterThread: Thread is done: Thread Group 1-2 
2018/05/21 09:12:58 INFO  - jmeter.threads.JMeterThread: Thread finished: Thread Group 1-2 
2018/05/21 09:12:58 INFO  - jmeter.engine.StandardJMeterEngine: Notifying test listeners of end of test 
2018/05/21 09:12:58 INFO  - jmeter.services.FileServer: Close: keystoreFile.csv 
2018/05/21 09:12:58 INFO  - jmeter.services.FileServer: Close: NGDA_new.csv 
2018/05/21 09:12:58 INFO  - jmeter.config.KeystoreConfig: Destroying Keystore 
2018/05/21 09:12:58 INFO  - jmeter.gui.util.JMeterMenuBar: setRunning(false,*local*)

根据mysql驱动程序docs

  

为了避免SQL注入攻击,你应该总是逃避任何攻击   用户在SQL查询中使用之前提供了数据。你可以这样做   使用var sql = `update node SET changed ${params.updationTime} where nid = ${params.nid}` mysql.escape()connection.escape()

pool.escape()

答案 1 :(得分:0)

让数据库处理和存储数据库逻辑,使用stored procedures

答案 2 :(得分:0)

由于以下原因,我更喜欢使用代码中的RAW参数查询

  1. 简单性:编写直接SQL查询是以本机方式与DB交互的最简单方法。

  2. ORM的复杂性:学习ORM基本上在项目中增加了另一层复杂性。您必须学习和掌握ORM,因为您可以在项目中完成任何专业的工作。该层和知识不会转化为其他平台,例如,如果您从Node切换到.NET C#。原生SQL知识可以从一个平台到另一个平台,而无需任何学习

  3. 当您需要编写一些自定义复杂查询时,ORM只是一个痛苦。并非所有查询都可以轻松地用ORM编写,通常您最终会遭到ORM的攻击。

  4. ORM在已经很复杂的代码之上又增加了一层复杂性。在开发软件时,我个人更喜欢简单

  5. ORM只是代码和数据库之间的另一层,许多ORM查询都遭受性能下降的困扰

  6. 在大型项目中,ORM成为瓶颈而不是受益。就像您不能雇用有经验的开发人员,如果其中一名开发人员离开了该项目。作为PM,您必须计算可用替换品的速度,通常很难找到特定的ORM工程师。通常情况下,PM然后会聘请经过一段时间培训的人员。新转换的ORM开发人员还会产生错误或非专业的代码

说过,对RAW查询使用ORM有好处。其中一些是与数据库和安全性进行交互的结构化方式。可以通过对查询进行参数化来处理RAW查询中的安全问题

答案 3 :(得分:0)

我同意沙阿扎德·阿斯兰(Shahzad Aslam)的观点。我要补充一点,您可以超越在Node.js应用程序中编写纯字符串的范围。我更喜欢将查询写为.sql文件,然后在运行时将它们解析为参数化查询(以避免sql注入)。这是example(示例用于Node-Postgres客户端,但对于MySQL应该相似)。

将查询写为实际的sql的好处在于,您可以获得模块化,突出显示语法以及使用首选的数据库客户端/工具直接针对数据库运行查询的能力(这对于性能分析和调试)。

相关问题