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