原始sql查询,如:
var sql = "update node SET changed = " + params.updationTime + " where nid = " + params.nid
是否建议在.js文件中编写原始sql查询?我们是否容易进行任何SQL注入?或者更好地使用Knex.js等库?
答案 0 :(得分:0)
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参数查询
简单性:编写直接SQL查询是以本机方式与DB交互的最简单方法。
ORM的复杂性:学习ORM基本上在项目中增加了另一层复杂性。您必须学习和掌握ORM,因为您可以在项目中完成任何专业的工作。该层和知识不会转化为其他平台,例如,如果您从Node切换到.NET C#。原生SQL知识可以从一个平台到另一个平台,而无需任何学习
当您需要编写一些自定义复杂查询时,ORM只是一个痛苦。并非所有查询都可以轻松地用ORM编写,通常您最终会遭到ORM的攻击。
ORM在已经很复杂的代码之上又增加了一层复杂性。在开发软件时,我个人更喜欢简单
ORM只是代码和数据库之间的另一层,许多ORM查询都遭受性能下降的困扰
在大型项目中,ORM成为瓶颈而不是受益。就像您不能雇用有经验的开发人员,如果其中一名开发人员离开了该项目。作为PM,您必须计算可用替换品的速度,通常很难找到特定的ORM工程师。通常情况下,PM然后会聘请经过一段时间培训的人员。新转换的ORM开发人员还会产生错误或非专业的代码
说过,对RAW查询使用ORM有好处。其中一些是与数据库和安全性进行交互的结构化方式。可以通过对查询进行参数化来处理RAW查询中的安全问题
答案 3 :(得分:0)
我同意沙阿扎德·阿斯兰(Shahzad Aslam)的观点。我要补充一点,您可以超越在Node.js应用程序中编写纯字符串的范围。我更喜欢将查询写为.sql
文件,然后在运行时将它们解析为参数化查询(以避免sql注入)。这是example(示例用于Node-Postgres客户端,但对于MySQL应该相似)。
将查询写为实际的sql
的好处在于,您可以获得模块化,突出显示语法以及使用首选的数据库客户端/工具直接针对数据库运行查询的能力(这对于性能分析和调试)。