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 safereturn 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. 离职跳槽再启航——三十二岁C++老程序员两年来的心路历程(一)

    2023年2月14日,天气阴,偶尔有太阳出没,刮风,比较冷,冬天还在持续,最近一两周的时间里没有一个像样的晴天. 去银行办了新公司的工资卡,提交了所有入职材料,整理了新租的房间,熟悉周围环境,为明天开 ...

  2. torch学习 (三十二):周杰伦歌词数据集与长短期记忆 (LSTM)

    文章目录 1 引入 2 长短期记忆 2.1 输入门.遗忘门和输出门 2.2 候选记忆细胞 2.3 记忆细胞 2.4 隐藏状态 3 代码 致谢 1 引入   本文介绍一种常用的门控循环神经网络:长短期记 ...

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

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

  4. STM32学习100步之第三十二步——MIDI音乐程序

    什么是MIDI音乐 MIDI音乐的产生原理 编写MIDI音乐 代码解读 什么是MIDI音乐 HIDI(Musical Instrument Digital Interface)乐器数字接口 是20世纪 ...

  5. Java多线程学习三十二:Callable 和 Runnable 的不同?

    为什么需要 Callable?Runnable 的缺陷 先来看一下,为什么需要 Callable?要想回答这个问题,我们先来看看现有的 Runnable 有哪些缺陷? 不能返回一个返回值 第一个缺陷, ...

  6. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  7. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

  8. JavaScript学习(三十二)— Keycode常用键位码对照表

    JavaScript学习(三十二)- Keycode常用键位码对照表 (一).字母和数字键的键码值(keyCode) (二).控制键键码值(keyCode) (三).多媒体键码值(keyCode)

  9. 深度学习入门(三十二)卷积神经网络——BN批量归一化

    深度学习入门(三十二)卷积神经网络--BN批量归一化 前言 批量归一化batch normalization 课件 批量归一化 批量归一化层 批量归一化在做什么? 总结 教材 1 训练深层网络 2 批 ...

最新文章

  1. java 基于虹软离线人脸识别SDK 2.0 最新版
  2. 网络编程1之计算机网络及参考模型、域名、服务器
  3. python 鱼c工作室作业_鱼C工作室Python作业
  4. 点击屏幕触发_MAC值得吹爆的便捷「触发角」功能
  5. liferay namespace用法
  6. uploadify插件的使用
  7. wxpython实现界面跳转
  8. word不能插入压缩包等文件的解决办法
  9. hdu 1074 Doing Homework
  10. C++学习 8.2 - 类及类成员
  11. 【第168期】游戏策划:草率了,这简历像极了脱缰的马儿
  12. 应用matlab快速实现实验对象随机分组,应用MATLAB快速实现实验对象随机分组
  13. 【Python_绘图】堆积柱形图
  14. Vue之v-on之修饰符prevent(007)
  15. 关于百度地图和高德地图,关于地图坐标系
  16. 免费版医疗器械计算机软件,医疗器械软件描述.docx
  17. linux下面安装和配置nginx
  18. 手机上的便签怎么发送到电脑上
  19. 如何使用按图搜索(拍立淘)获取商品数据
  20. 计算机在初中物理中应用,多媒體计算机技术在初中物理教学中的应用.doc

热门文章

  1. interpro 数据库
  2. iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted
  3. python下载vip素材_Python下载素材脚本
  4. 直击|咪蒙、才华有限青年注销 旗下公众号清空或停更
  5. 小米3 SIM 卡无法识别
  6. 微信开放平台(公众号第三方平台) -- 全网发布
  7. 程序网络访问出错:lacked sufficient buffer space
  8. word2016去除回车符和换行符的方法
  9. 【转载】第6节: 六类Calander处理六种不同的时间场景
  10. mySql 脏读,幻读,不可重复度与事务隔离级别