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 的设计以及功能还是很方便的,功能很齐全。

参考资料

https://ballerina.io/learn/how-to-write-secure-ballerina-code/

 
 
 
 

ballerina 学习 三十二 编写安全的程序的更多相关文章

  1. ElasticSearch7.3学习(三十二)----logstash三大插件(input、filter、output)及其综合示例

    1. Logstash输入插件 1.1 input介绍 logstash支持很多数据源,比如说file,http,jdbc,s3等等 图片上面只是一少部分.详情见网址:https://www.elas ...

  2. ballerina 学习 三十 扩展开发(一)

    ballerina 主要是分为两大类 基于ballerina 语言开发的,一般是客户端的connector 使用java语言开发的(类似的基于jvm的都可以),一般是注解以及进行构件生成 baller ...

  3. Java开发学习(三十二)----Maven多环境配置切换与跳过测试的三种方式

    一.多环境开发 我们平常都是在自己的开发环境进行开发, 当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用, 等测试人员测试通过后,我们会将项目部署到生成环境上线使用. 这个时候就有一 ...

  4. Salesforce LWC学习(三十二)实现上传 Excel解析其内容

    本篇参考:salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容 上一篇我们写了aura方式上传excel解析其内容.lwc作为salesforce的新宠儿,逐渐的 ...

  5. python学习 (三十二) 异常处理

    1 异常: def exceptionHandling(): try: a = b = d = a / b print(d) except ZeroDivisionError as ex: print ...

  6. NeHe OpenGL教程 第三十二课:拾取游戏

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  8. “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  9. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

随机推荐

  1. English trip -- Phonics 4 元音字母 i

    IPA   国际音标(英语:International Phonetic Alphabet [ælfəbet],缩写:IPA),早期又称万国音标 VOWELS [ɪ]   [u]   [ʌ]   [ɒ ...

  2. python-day39--mysql基本操作

    1.修改密码: mysqladmin -uroot password 123 2.忘记密码如何修改密码: 1.干掉data目录---> 重新初始化   (不推荐,所有授权信息全部丢失!!!) 2 ...

  3. python-day21--序列化模块模块

    什么叫序列化——将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化   序列化的目的: 1.以某种存储形式使自定义对象持久化: 2.将对象从一个地方传递到另一个地方. 3.使程序更具维护性. ...

  4. UVA-10163 Storage Keepers (0-1背包)

    题目大意:有n个仓库,m个应聘者,每人对应一个能力值.一个人可以看多个仓库,一间仓库只能被一个人看.如果一个能力为p的人看k间仓库,那么安全系数为p/k,求出最大的最小安全系数,并且求出在此情况下所有 ...

  5. UVA-12569 Planning mobile robot on Tree (EASY Version) (BFS+状态压缩)

    题目大意:一张无向连通图,有一个机器人,若干个石头,每次移动只能移向相连的节点,并且一个节点上只能有一样且一个东西(机器人或石头),找出一种使机器人从指定位置到另一个指定位置的最小步数方案,输出移动步 ...

  6. javascript primise本质——为了简化异步编码而针对异步操作的代理

    概述 所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 语法 new Promise(executor); new Promise(functio ...

  7. Hash索引和BTree索引

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  8. POJ 1947 Rebuilding Roads 树形dp 难度:2

    Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9105   Accepted: 4122 ...

  9. 根据ip,实现地址信息查询接口

    偶然发现的360搜索的ip查询接口,记录下: 接口地址:https://m.so.com/position 使用方式1:传ip 如访问https://m.so.com/position?ip=47.1 ...

  10. MyEclipse CI 2018.8.0正式发布(附下载)

    MyEclipse线上特惠,在线立享专属折扣!火热开启中>> MyEclipse 2018最终版日前正式发布,新版本通过构建Eclipse Photo.支持Java 10和Java EE ...