1. 程式人生 > >nodejs sequelize庫防注入測試

nodejs sequelize庫防注入測試

介紹

  • 在nodejs中使用sequlize庫來查詢mysql資料庫, 提供了常用的方法有兩種:

    1. 直接查詢sql語句: sequelize.query();
    2. 通過介面,如Project.findAll();
  • sequelize的第2種查詢方法在實現上做了防注入處理, 但該方法使用並不是很靈活, 對於經常使用原生sql語句的人來說, 總有一種不適應, 感覺手腳被束縛; 而對於使用方法1, 則必須注意防sql注入;

這裡我測試前面提到的兩種查詢方式如何做到初步的防sql注入功能;

sql注入

產生原因

下面的查詢語句, 加入了使用者輸入的時間項: begin, end

, 正常情況是:

begin = 20161101;
SELECT .. FROM tbl WHERE pdate>=20161101 AND ...;

而如果有人故意輸入如下的引數, 則就會出現sql注入:

begin = '20161101 AND 1=1; -- hack';
SELECT .. FROM tbl WHERE pdate>=20161101 AND 1=1; -- hack ...;

解決辦法

解決上面的辦法, 通常有兩種:
1. 對輸入的引數進行轉義, 因為sql注入通常需要'符號來閉合前面的', 這樣如果位面在輸入的引數中的'全部轉義為\', 則查詢時就不會出現中斷(執行兩條sql語句), 參看下面的例子;
2. 設定mysql只能一次執行一條sql語句;

測試

sequelize.query()Project.findAll()對比

先看程式碼

var tblName = 'tbl_test', begin = '20160923 AND 1=1;-- hack', end = 20160928;
var sqlQuery = `SELECT * FROM ${tblName} WHERE pdate>=${begin} AND pdate<=${end} GROUP BY pdate`;
Promise.resolve([
    // 第一條查詢
    sequelize.query(sqlQuery),   
    // 第一二條查詢
Project.findAll({ attributes: { exclude:['id'] }, where: { pdate: { $and:{ // 引數中加上了'來閉合前面的', 後面的1=1為注入語句 $gte: "20160923' AND 1=1;-- hack", $lte: end } } } }) ]).spread(function(sql1, sql2){ })
  • 上面第一個為sequelize.query()執行, 最終執行的查詢語句為:
select * from tbl_test where padte>=20160923 and 1=1;-- hack and pdate<=....; 

結果出現注入, pdate<=..這一塊的條件沒有被執行;

  • 上面第二個查詢為Project.findAll()執行, 最終執行的語句為:
select * from tbl_test where pdate>'20160923\' AND 1=1;-- hack' AND pdate<='...'.....; 

顯然,這裡引數裡的20160923'引號沒有起作用, 被轉換為了`20160923\”,所以有效避免了注入, 制查詢了符合要求的資料或空資料;

sequelize.query() + 引數繫結

下面通過sequelize.query()介面提供的引數繫結和查詢方法指定來防止sql注入的發生.

  • 下面的查詢語句解析為:
    select * from tbl_test where padte>='20160923 and 1=1;-- hack' and pdate<=....;
    字串被直接替換,沒有被注入;
  • 注意,這裡的表名table不能通過bind的引數傳進去, 因為這樣在語句裡會表達為字串: …. from ‘tbl_test’ where …, 這樣是錯誤的語句,所以上面用字串模板傳入,也可以硬編碼進去;
var tblName = 'tbl_test', begin = '20160923 AND 1=1;-- hack', end = 20160928;
var sqlQuery = `SELECT * FROM ${tblName} WHERE pdate>=$begin AND pdate<=$end GROUP BY pdate`;
Promise.resolve([
    sequelize.query(sqlQuery,
        type: ymModel.sequelize.QueryTypes.SELECT,  // 指定sql為SELECT
        bind: { 
            begin: begin, 
            end: end 
        }
    ),
]).spread(function(sql1){

})

相關推薦

nodejs sequelize注入測試

介紹 在nodejs中使用sequlize庫來查詢mysql資料庫, 提供了常用的方法有兩種: 直接查詢sql語句: sequelize.query(); 通過介面,如Project.f

php pdo類 注入,事務,多自動選擇,鏈式操作

因為某些原因目前業務不用框架開發,自己寫了一個pdo類實現防注入,事務等,後續還會繼續完善  <?php /*

c語言函數測試

print 異常終止 不存在 eache 函數名 mode .com src 參數 1.函數名: abort功 能: 異常終止一個進程用 法: void abort(void);程序例: 1 #include <stdio.h> 2 #include &l

Jmeter MySQL數據性能測試

添加jar包 config 查詢 req amp height 變量名 class 默認 準備工作: 1、設置java環境變量 (可以問百度,他知道的太多了); 2、要知道數據庫訪問地址(IP)和用戶名、密碼; 3、下載驅動包,將mysql-connector-Java.

Jmeter連接SqlServer數據進行壓力測試

jmeter 性能測試 前提準備:先安裝jdbc驅動驅動下載鏈接地址:http://pan.baidu.com/s/1bpDpjSr 密碼:v6tn 下載解壓之後,講sqljdbc4.jar放置jmeter的安裝目錄/lib下;復制之後重新啟動jmeter;1.測試計劃—配置驅動程序 測試計劃

(轉)用mysql自帶工具mysqlslap對數據進行壓力測試

執行 fec syntax counter stat autoload show 多少 creat http://aolens.blog.51cto.com/7021142/1901557-------用mysql自帶工具mysqlslap對數據庫進行壓力測試 mysqls

數據性能測試方案示例

blog 數據庫 alt http mage tail post src class 原文地址:dhttp://blog.csdn.net/qq_23101033/article/details/76825559 數據庫性能測試方案示例

Nodejs】Browsersync同步瀏覽器測試

配置 pan sync itl 環境變量 html rsync blog npm 說明文檔:http://www.browsersync.cn/docs/ 安裝命令: ①全局安裝 npm install -g browser-sync ②局部/本地安裝 npm in

數據編程測試機試 QQ

del 年齡 tab 安陽 AD 積極 表名 pos 超過 創建QQ數據庫 #創建數據庫 CREATE DATABASE QQ #創建表名 並且添加列 DROP TABLE IF EXISTS `dbo.BaseInfo`; CREATE TABLE `st

GreenPlum數據故障恢復測試

gpdb mirror segment primary segment master failover 本文介紹gpdb的master故障及恢復測試以及segment故障恢復測試。 環境介紹:Gpdb版本:5.5.0 二進制版本操作系統版本: centos linux 7.0Master

Oracle數據性能測試工具:Swingbench部署實錄

swingbench[root@king01 ~]# su - oracle [oracle@king01 ~]$ sqlplus / as sysdba SQL> create tablespace soe datafile '/u01/app/oracle/oradata/king/

【JMeter4.0學習(十一)】之JMeter對(Mysql、Oracle)數據性能測試腳本開發

conn 遇到的問題 mys .cn SQ 數據庫性能測試 pos rac 問題總結 一、MySQL數據庫鏈接: 註:下面所產生的問題一律參考詳見:《【JMeter4.0】之遇到的問題總結(持續更新)》(包括Mysql、Orcale) 準備:引包,包路徑一定要放對位置,

java~springboot~h2數據在單元測試中的使用

存儲 會同 oot 直接 context user get pil runner 單元測試有幾點要說的 事實上springboot框架是一個tdd框架,你在進行建立項目時它會同時建立一個單元測試項目,而我們的代碼用例可以在這個項目裏完成,對於單元測試大叔有以下幾點需要說明一

npm 工具(用來安裝和管理nodejs包的一個工具。所有使用nodejs第三方的項目,都需要在項目初始化的時候 使用 npm init 命令來初始項目)

des auth 暫時 cif 通過 作用 hello amp `` 新建項目 npm init```package.json ```{ "name": "webpackdemo1", 項目名稱,包名,不能是grunt或webpack "version": "1.

Nginx壓力測試

一、ab壓力測試方式為:   $ab -n 1000 -c 100 http://www.abc.com:80/ 二、直接簡單的方法限制同一個IP的併發最大為10:(以寶塔管理工具為例)   1、開啟Nginx伺服器的管理新增:limit_conn_zone $binary_remote_addr zo

最新天貓3輪面試題目:虛擬機器+併發鎖+Sql注入+Zookeeper

一面 自我介紹、專案介紹 Spring攔截器、實現了哪些方法?底層原理 AOP如何配置,底層原理、2種動態代理,aop註解實現,xml定義切面 Bean的作用域,單例模式是否執行緒安全?惡漢模式是否執行緒安全?bean如何結束生命週期? Spring事務種類,如

2018年天貓3輪面試題目:虛擬機器+併發鎖+Sql注入+Zookeeper

一面 自我介紹、專案介紹 Spring攔截器、實現了哪些方法?底層原理 AOP如何配置,底層原理、2種動態代理,aop註解實現,xml定義切面 Bean的作用域,單例模式是否執行緒安全?惡漢模式是否執行緒安全?bean如何結束生命週期? Spring事務種

登入注入最簡單的實現

原來是這樣寫的,當我登入時輸入:' or 1=1 -- 會導致登入成功!這樣讓我必須要做防注入。 /** * 獲取登入使用者 * @param userName * @param md5password * @return */

SQL注入 web開發中防止SQL注入

web開發中防止SQL注入   一、SQL注入簡介 SQL注入是比較常見的網路攻擊方式之一,它不是利用作業系統的BUG來實現攻擊,而是針對程式設計師編寫時的疏忽,通過SQL語句,實現無賬號登入,甚至篡改資料庫。 二、SQL注入攻擊的總體思路 1.尋找到SQL

bug解決-核心C寫(FORTIFY: write: prevented read past end of buffer)

備註:展訊平臺 1、問題描述   昨天同事問我一個問題,報的是一個native crash問題,問題log如下所示: 01-05 00:01:12.600 2794 6237 F libc : Fatal signal 6 (SIGABRT), code -6 in