首頁>技術>

如果用Node.JS做Web服務,很多時候是會選擇Express的。

本文,將展示如何如何實現一個WAF中介軟體。

WAF有什麼用?

WAF即Web Application Firewall,Web應用防火牆,防攻擊、防黑客的。

小提示:npm上,目前還沒有專業的express中介軟體WAF,這可是稀缺的技術!

先看完整示例程式碼:

var express = require('express');var app = express();//當訪問根目錄時觸發app.get('/', function (req, res) {   res.send('Hello Jshaman.com');})//WAF中介軟體app.use(function(req, res, next) {    var path = req.url;    console.log(path);    if(waf_detect(path) == false){        next();    }    //console.log(req.cookies);    //console.log(req.headers['user-agent']);});//使用正則表示式,檢測字串是否含有攻擊特徵,檢測到攻擊特徵返回true,沒檢測到返回falsefunction waf_detect(str_to_detect){    var regexp_rule =[        /select.+(from|limit)/i,        /(?:(union(.*?)select))/i,        /sleep\\((\\s*)(\\d*)(\\s*)\\)/i,        /group\\s+by.+\\(/i,        /(?:from\\W+information_schema\\W)/i,        /(?:(?:current_)user|database|schema|connection_id)\\s*\\(/i,        /\\s*or\\s+.*=.*/i,        /order\\s+by\\s+.*--$/i,        /benchmark\\((.*)\\,(.*)\\)/i,        /base64_decode\\(/i,        /(?:(?:current_)user|database|version|schema|connection_id)\\s*\\(/i,        /(?:etc\\/\\W*passwd)/i,        /into(\\s+)+(?:dump|out)file\\s*/i,        /xwork.MethodAccessor/i,        /(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\(/i,        /\\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i,        /(onmouseover|onmousemove|onerror|onload)\\=/i,        /javascript:/i,        /\\.\\.\\/\\.\\.\\//i,        /\\|\\|.*(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i,        /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\\|\\|/i,        /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\\:\\//i    ];    for(i=0; i< regexp_rule.length; i++){        if(regexp_rule[i].test(str_to_detect) == true){\t\t\tconsole.log("attack detected, rule number:", "("+i+")", regexp_rule[i]);\t\t\treturn true;        }    }    return false;}var server = app.listen(8000, function () {   var host = server.address().address   var port = server.address().port   console.log(host, port);}) 

本示例,是一個帶有WAF功能的Web應用。

內建的中介軟體部分,實現WAF的防護功能:

//WAF中介軟體app.use(function(req, res, next) {    var path = req.url;    console.log(path);    if(waf_detect(path) == false){        next();    }    //console.log(req.cookies);    //console.log(req.headers['user-agent']);});

即,對發起的請求進行過濾,判斷請求中是否有惡意行為。如果有,則不讓中件間進行next(),請求也就被中斷,達到防止攻擊者入侵的目的。

WAF防護規則

攻擊檢測使用的是正則表示式,這是WAF常用的攻擊檢測方式。

這套規則來自ShareWAF,ShareWAF是專業、強大的WAF商業產品。

//This rule from:www.sharewaf.comvar regexp_rule =[        /select.+(from|limit)/i,        /(?:(union(.*?)select))/i,        /sleep\\((\\s*)(\\d*)(\\s*)\\)/i,        /group\\s+by.+\\(/i,        /(?:from\\W+information_schema\\W)/i,        /(?:(?:current_)user|database|schema|connection_id)\\s*\\(/i,        /\\s*or\\s+.*=.*/i,        /order\\s+by\\s+.*--$/i,        /benchmark\\((.*)\\,(.*)\\)/i,        /base64_decode\\(/i,        /(?:(?:current_)user|database|version|schema|connection_id)\\s*\\(/i,        /(?:etc\\/\\W*passwd)/i,        /into(\\s+)+(?:dump|out)file\\s*/i,        /xwork.MethodAccessor/i,        /(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\\(/i,        /\\<(iframe|script|body|img|layer|div|meta|style|base|object|input)/i,        /(onmouseover|onmousemove|onerror|onload)\\=/i,        /javascript:/i,        /\\.\\.\\/\\.\\.\\//i,        /\\|\\|.*(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv)/i,        /(?:ls|pwd|whoami|ll|ifconfog|ipconfig|&&|chmod|cd|mkdir|rmdir|cp|mv).*\\|\\|/i,        /(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\\:\\//i    ];

規則邏輯暫且不詳細探討,因為它是正則表示式,如果詳細講述起來,恐怕得另多寫三五篇文章了。

執行效果:

模擬訪問發起攻擊:

http://127.0.0.1:8000/index.html

即在url中傳入select*from admin語句,這是一句常見的SQL注入攻擊語句。

可以看到,網站無法開啟。在後臺輸出了攔截資訊,並提示出觸發了哪條WAF防護規則。

本文只做演示,僅檢測了url路徑。

那麼本程式碼是可以括展的,可以檢測cookie、user-agent、post資料等常見攻擊點。

寫成一個Express模組是完全可以的。

更多本系列文章:

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Tomcat應用配置之web.xml--學習框架必須要知道的