1. 程式人生 > >ballerina 學習 三十二 編寫安全的程式

ballerina 學習 三十二 編寫安全的程式

ballerina編譯器已經集成了部分安全檢測,在編譯時可以幫助我們生成錯誤提示,同時ballerina 標準庫
已經對於常見漏洞高發的地方做了很好的處理,當我們編寫了有安全隱患的程式碼,編譯器就已經提示給
我們了。
常見的問題

  • sql 注入
  • path 操作
  • file 操作
  • 未授權檔案訪問
  • 為校驗的重定向

確保ballerina 標準庫的安全

ballerina 標準庫對於安全敏感的函式以及操作使用@sensitive 註解進行說明,可以確保容易出現漏洞的資料傳遞
給引數
比如,ballerina 標準庫的select

public native function select(@sensitive string sqlQuery, typedesc? recordType,
                              boolean loadToMemory = false, Param... parameters)
                             returns @tainted table|error;

安全的使用不可信資料

實際中我們肯定會碰到需要傳遞非可信資料,我們可以使用 untaint 表示式進行處理,同時對於返回值我們可以使用
@untainted 註解
參考

boolean isValid = isNumeric(studentId);
if (isValid) {
   var dt = testDB->select("SELECT NAME FROM STUDENT WHERE ID = " +
                           untaint studentId, ResultStudent);
}

function sanitizeSortColumn (string columnName) returns @untainted string {
   string sanitizedSortColumn = columnName;
   // Sanitize logic to make sure return value is safe
   return sanitizedSortColumn;
}

保護密碼以及secret key

ballerina 提供了api 可以訪問不同源的配置資訊,對於配置檔案中包含密碼資訊的必須加密
處理,框架提供了工具可以對於配置進行加密

ballerina encrypt
按照提示輸入需要加密的名稱,會生成一個加密key,我們可以使用配置檔案,或者環境變數獲取。
預設會找一個secret.txt的檔案,裡面儲存了加密金鑰,請求之後會自動刪除,對於沒有這個檔案的
會提示輸入金鑰

認證&&授權

ballerina 的 http 服務可以配置的方式增強認證以及授權,ballerina 支援jwt 以及basic 模式的認證,
使用basic模式時,使用者資訊可以通過配置檔案載入,同時推薦使用https 方式進行資料訪問,增強
安全性

  • jwt 認證
    可以通過http:AuthProvider 進行配置
    參考
import ballerina/http;

http:AuthProvider jwtAuthProvider = {
   scheme:"jwt",
   issuer:"ballerina",
   audience: "ballerina.io",
   clockSkew:10,
   certificateAlias: "ballerina",
   trustStore: {
       path: "${ballerina.home}/bre/security/ballerinaTruststore.p12",
       password: "ballerina"
   }
};

endpoint http:SecureListener secureHelloWorldEp {
   port:9091,
   authProviders:[jwtAuthProvider],
   secureSocket: {
       keyStore: {
           path: "${ballerina.home}/bre/security/ballerinaKeystore.p12",
           password: "ballerina"
       }
   }
};

@http:ServiceConfig {
   basePath:"/hello"
}
service<http:Service> helloWorld bind secureHelloWorldEp {

   @http:ResourceConfig {
       methods:["GET"],
       path:"/"
   }
   sayHello (endpoint caller, http:Request req) {
       http:Response resp = new;
       resp.setTextPayload("Hello, World!");
       _ = caller->respond(resp);
   }
}
  • http basic 認證
    參考程式碼
import ballerina/http;

http:AuthProvider basicAuthProvider = {
   scheme:"basic",
   authStoreProvider:"config"
};

endpoint http:SecureListener secureHelloWorldEp {
   port:9091,
   authProviders:[basicAuthProvider],
   secureSocket: {
       keyStore: {
           path: "${ballerina.home}/bre/security/ballerinaKeystore.p12",
           password: "ballerina"
       }
   }
};

@http:ServiceConfig {
   basePath:"/hello",
   authConfig:{
      scopes:["hello"]
   }
}
service<http:Service> helloWorld bind secureHelloWorldEp {

   @http:ResourceConfig {
       methods:["GET"],
       path:"/"
   }
   sayHello (endpoint caller, http:Request req) {
       http:Response resp = new;
       resp.setTextPayload("Hello, World!");
       _ = caller->respond(resp);
   }
}

使用者賬戶配置資訊(通過配置檔案)

sample-users.toml

["b7a.users"]

["b7a.users.generalUser"]
password="@encrypted:{pIQrB9YfCQK1eIWH5d6UaZXA3zr+60JxSBcpa2PY7a8=}"

["b7a.users.admin"]
password="@encrypted:{pIQrB9YfCQK1eIWH5d6UaZXA3zr+60JxSBcpa2PY7a8=}"
scopes="hello"

載入配置

ballerina run --config sample-users.toml basic_auth_sample.bal
  • 說明
    在認證服務的同時,我們可以配置scope,指定許可權範圍,還是比較方便的

下游服務的認證

實際上就是在client 端載入認證資訊,方便呼叫

  • 一個jwt client 的例子
import ballerina/http;

http:AuthProvider jwtAuthProvider = {
   scheme:"jwt",
   propagateToken: true,
   issuer:"ballerina",
   audience: "ballerina.io",
   clockSkew:10,
   certificateAlias: "ballerina",
   trustStore: {
       path: "${ballerina.home}/bre/security/ballerinaTruststore.p12",
       password: "ballerina"
   }
};

endpoint http:SecureListener secureHelloWorldEp {
   port:9091,
   authProviders:[jwtAuthProvider],
   secureSocket: {
       keyStore: {
           path: "${ballerina.home}/bre/security/ballerinaKeystore.p12",
           password: "ballerina"
       }
   }
};

endpoint http:Client downstreamServiceEP {
   url: "https://localhost:9092",
   auth: { scheme: http:JWT_AUTH },
   secureSocket: {
       trustStore: {
           path: "${ballerina.home}/bre/security/ballerinaTruststore.p12",
           password: "ballerina"
       }
   }
};

@http:ServiceConfig {
   basePath:"/hello",
   authConfig:{
      scopes:["hello"]
   }
}
service<http:Service> helloWorld bind secureHelloWorldEp {

   @http:ResourceConfig {
       methods:["GET"],
       path:"/"
   }
   sayHello (endpoint caller, http:Request req) {
       http:Response response = check downstreamServiceEP->get("/update-stats",
                                                         message = untaint req);
       _ = caller->respond(response);
   }
}

// ----------------------------------------------
// Following code creates the downstream service
// ----------------------------------------------

http:AuthProvider downstreamJwtAuthProvider = {
   scheme:"jwt",
   issuer:"ballerina",
   audience: "ballerina.io",
   clockSkew:10,
   certificateAlias: "ballerina",
   trustStore: {
       path: "${ballerina.home}/bre/security/ballerinaTruststore.p12",
       password: "ballerina"
   }
};

endpoint http:SecureListener secureUpdateServiceEp {
   port:9092,
   authProviders:[downstreamJwtAuthProvider],
   secureSocket: {
       keyStore: {
           path: "${ballerina.home}/bre/security/ballerinaKeystore.p12",
           password: "ballerina"
       }
   }
};

@http:ServiceConfig {
   basePath:"/update-stats"
}
service<http:Service> updateService bind secureUpdateServiceEp {

   @http:ResourceConfig {
       methods:["GET"],
       path:"/"
   }
   updateStats (endpoint caller, http:Request req) {
       http:Response resp = new;
       resp.setTextPayload("Downstream Service Received JWT: " +
                           untaint req.getHeader("Authorization"));
       _ = caller->respond(resp);
   }
}

說明

ballerina 的設計以及功能還是很方便的,功能很齊全。

參考資料

相關推薦

ballerina 學習 編寫安全程式

ballerina編譯器已經集成了部分安全檢測,在編譯時可以幫助我們生成錯誤提示,同時ballerina 標準庫 已經對於常見漏洞高發的地方做了很好的處理,當我們編寫了有安全隱患的程式碼,編譯器就已經提示給 我們了。 常見的問題 sql 注入 path 操作 file 操作 未授

ballerina 學習 一 擴充套件開發(

上篇說了使用ballerina 語言開發擴充套件模組,對於註解型別的我們是需要使用java 語言進行 開發的 註解擴充套件外掛的使用 這個註解是呼叫方法之後,會生成一個文字檔案 import ballerina/http; import ballerinax/hello; @hell

學習

linux學習八周一次課(3月26日)10.23 linux任務計劃cron10.24 chkconfig工具10.25 systemd管理服務10.26 unit介紹10.27 target介紹擴展 anacron http://blog.csdn.net/strikers1982/article/det

【Katalon學習】斷言語句

斷言語句包含一個布林表示式,其中該條件必須為true,測試執行才能繼續。因此,斷言的執行會導致布林表示式的計算,如果表示式的計算結果為false,則會報告錯誤。 手動檢視中的Assert語句 1. 在手動檢視中開啟一個測試用例,然後從command工具欄導航到Assert語句。

ballerina 學習 擴充套件開發(一)

ballerina 主要是分為兩大類 基於ballerina 語言開發的,一般是客戶端的connector 使用java語言開發的(類似的基於jvm的都可以),一般是註解以及進行構件生成 ballerina 語言開發說明 是一個ballerian 的包 建立一個物件包含了init 、ge

shell學習天----read讀取一行

標準輸入輸出與標準錯誤輸出 標準輸入/輸出可能是軟體工具設計原則裡最基本的觀念了.他的構想是:程式應有一個數據來源,資料出口(資料要去哪裡),以及報告問題的地方.他們分別叫做標準輸入,標準輸出和標準錯誤輸出.程式應該不知道也不在意其輸入與輸出背後是另一個執行的程式!程式可以

Linux學習)screen

oot mst tail pre linux article col install vmstat screen概述 我們可以將screen看成一個子窗口,我們可以通過命令將這個子窗口放入後臺運行而不關閉它。當我們有需要時,我們還可以將它調出來。 screen使用 安裝

Linux學習筆記()iptables filter表案例、 iptables nat表應用

iptables filter表案例、 iptables nat表應用 一、iptables filter表案例需求:將80、20、21端口放行,對22端口指定特定的ip才放行以下為操作方法:vim /usr/local/sbin/iptables.sh //加入如下內容#! /bin/bas

Linux學習總結()lamp之php安裝

php libphp5.so lamp PHP官網www.php.net當前主流版本為5.6/7.1 cd /usr/local/src/ wget http://cn2.php.net/distributions/php-5.6.30.tar.gz tar zxf php-5.6.30.tar

Linux學習筆記次課 (4月25日)

nginx 訪問日誌 日誌切割 靜態文件 12.10 Nginx訪問日誌vim /usr/local/nginx/conf/nginx.conf //搜索log_format$remote_addr //客戶端P(公網IP)$http_x_forwarded_for //代理服務器的IP$ti

學習筆記第節課

作業iptables規則備份和恢復。 service iptables save 會把規則保存到 /etc/sysconfig/iptables配置文件中,但是有時候不想保存這個位置。 可以用命令 iptables-sabe > 到你想保存的位置。 恢復備份的規則的話 是iptables-re

、python學習之Flask框架(四)模板:jinja2模板、過濾器、模板複用(繼承、巨集、包含)、瞭解CSRF跨站請求攻擊

一、jinja2模板引擎的簡介: 1.模板: 1.1檢視函式的兩個作用: 處理業務邏輯; 返回響應內容; 1.3 什麼是模板: 模板其實是一個包含響應文字的檔案,不是特指的html檔案,其中用佔位符(變數)表示動態部分,告訴模板引擎其具體的

ElasticSearch學習筆記之 JAVA Client 之 Exists Delete Update APIs

ElasticSearch學習筆記之三十二 JAVA Client 之 Exists Delete Update APIs Exists API Exists Request Synchronous Execution(同步執行) Asy

吳恩達機器學習訓練祕籍整理八到章(四)學習曲線

第二十八章: 繪製學習曲線。隨著訓練集的增加,錯誤率逐漸的減少。  第二十九章: 繪製訓練誤差曲線。隨著訓練集大小的增加,開發集(和測試集)誤差應該會降低,但你的訓練集誤差往往會同時增加。  第三十章: 高偏差: 隨著我們新增更多的訓練

學習筆記第節:線性規劃與單純形

正題       我們今天講一下線性規劃,以這一道題為例:#179. 線性規劃       首先面對一堆小於等於的約束,我們應該怎麼做?       我們以樣例來解釋:   &nb

opencv學習筆記:Haar特徵與積分影象

一、 Haar特徵定義         Haar特徵是基於“塊”的特徵,也被稱為矩形特徵。Haar特徵(模板)分為三類:邊緣特徵、線性特徵、中心特徵和對角線特徵。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值為白色矩形畫素和減去黑色矩形畫素和。Haar特徵值反映了影象

小甲魚《零基礎學習Python》課後筆記(

測試題 0.結合你自身的程式設計經驗,總結下異常處理機制的重要性? 可以增強程式的適應環境的能力,提升使用者體驗。 1.請問以下程式碼是否會產生異常,如果會的話,請寫出異常的名稱: >>> my_list = [1, 2, 3,

機器學習)——t-SNE, Adaboost

t-SNE(續) SNE 在介紹t-SNE之前,我們首先介紹一下SNE(Stochastic Neighbor Embedding)的原理。 假設我們有資料集X,它共有N個數據點。每一個數據點xixi的維度為D,我們希望降低為d維。在一般用於視覺化的條

C# EMGU 3.4.1學習筆記()示例程式:直方圖均衡化(彩色影象)

本示例是《OpenCV3程式設計入門》中7.5.3中的示例程式的C# + EMGU 3.4.1版,演示瞭如何用EqualizeHist()函式進行影象的直方圖均衡化。 原書程式碼僅演示了對灰度影象的直方圖均衡化,對此我做了一些改變,從而可對彩色影象進行直方圖均衡化。 彩色

Python學習之旅(

Python基礎知識(31):圖形介面(Ⅱ) Python內建了turtle庫,可以在計算機上繪圖 運動控制: 1、畫筆定位到座標(x,y):turtle.goto(x,y) 2、向正方向運動 distance 長的距離:turtle.forward(distance) 3、向負方向運動 dista