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 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 学习 三十二 编写安全的程序相关推荐
- 离职跳槽再启航——三十二岁C++老程序员两年来的心路历程(一)
2023年2月14日,天气阴,偶尔有太阳出没,刮风,比较冷,冬天还在持续,最近一两周的时间里没有一个像样的晴天. 去银行办了新公司的工资卡,提交了所有入职材料,整理了新租的房间,熟悉周围环境,为明天开 ...
- torch学习 (三十二):周杰伦歌词数据集与长短期记忆 (LSTM)
文章目录 1 引入 2 长短期记忆 2.1 输入门.遗忘门和输出门 2.2 候选记忆细胞 2.3 记忆细胞 2.4 隐藏状态 3 代码 致谢 1 引入 本文介绍一种常用的门控循环神经网络:长短期记 ...
- ballerina 学习 三十 扩展开发(一)
ballerina 主要是分为两大类 基于ballerina 语言开发的,一般是客户端的connector 使用java语言开发的(类似的基于jvm的都可以),一般是注解以及进行构件生成 baller ...
- STM32学习100步之第三十二步——MIDI音乐程序
什么是MIDI音乐 MIDI音乐的产生原理 编写MIDI音乐 代码解读 什么是MIDI音乐 HIDI(Musical Instrument Digital Interface)乐器数字接口 是20世纪 ...
- Java多线程学习三十二:Callable 和 Runnable 的不同?
为什么需要 Callable?Runnable 的缺陷 先来看一下,为什么需要 Callable?要想回答这个问题,我们先来看看现有的 Runnable 有哪些缺陷? 不能返回一个返回值 第一个缺陷, ...
- tensorflow学习笔记(三十二):conv2d_transpose (解卷积)
tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...
- OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己
OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...
- JavaScript学习(三十二)— Keycode常用键位码对照表
JavaScript学习(三十二)- Keycode常用键位码对照表 (一).字母和数字键的键码值(keyCode) (二).控制键键码值(keyCode) (三).多媒体键码值(keyCode)
- 深度学习入门(三十二)卷积神经网络——BN批量归一化
深度学习入门(三十二)卷积神经网络--BN批量归一化 前言 批量归一化batch normalization 课件 批量归一化 批量归一化层 批量归一化在做什么? 总结 教材 1 训练深层网络 2 批 ...
最新文章
- java 基于虹软离线人脸识别SDK 2.0 最新版
- 网络编程1之计算机网络及参考模型、域名、服务器
- python 鱼c工作室作业_鱼C工作室Python作业
- 点击屏幕触发_MAC值得吹爆的便捷「触发角」功能
- liferay namespace用法
- uploadify插件的使用
- wxpython实现界面跳转
- word不能插入压缩包等文件的解决办法
- hdu 1074 Doing Homework
- C++学习 8.2 - 类及类成员
- 【第168期】游戏策划:草率了,这简历像极了脱缰的马儿
- 应用matlab快速实现实验对象随机分组,应用MATLAB快速实现实验对象随机分组
- 【Python_绘图】堆积柱形图
- Vue之v-on之修饰符prevent(007)
- 关于百度地图和高德地图,关于地图坐标系
- 免费版医疗器械计算机软件,医疗器械软件描述.docx
- linux下面安装和配置nginx
- 手机上的便签怎么发送到电脑上
- 如何使用按图搜索(拍立淘)获取商品数据
- 计算机在初中物理中应用,多媒體计算机技术在初中物理教学中的应用.doc
热门文章
- interpro 数据库
- iOS逆向开发(2):获取APP的类声明 | class-dump | dumpdecrypted
- python下载vip素材_Python下载素材脚本
- 直击|咪蒙、才华有限青年注销 旗下公众号清空或停更
- 小米3 SIM 卡无法识别
- 微信开放平台(公众号第三方平台) -- 全网发布
- 程序网络访问出错:lacked sufficient buffer space
- word2016去除回车符和换行符的方法
- 【转载】第6节: 六类Calander处理六种不同的时间场景
- mySql 脏读,幻读,不可重复度与事务隔离级别