2

我正在尝试动态传递我的后端请求的路径。但是路径变量是敏感参数,因此不允许我传递传入路径或任何字符串,例如 studentInfoEP->get("/student" + studentId);

知道我们该怎么做吗?

endpoint http:Client studentInfoEP {
    url: "http://localhost:9091/studentinfo"
};

@http:ServiceConfig { basePath: "/studentfinder" }
service<http:Service> studentFinder bind listener {


    @http:ResourceConfig {
        methods: ["GET"],
        path: "/{studentId}"
    }
    getStudentById(endpoint client, http:Request req, string studentId) {

        var studentInfoResp = studentInfoEP->get(req.rawPath);
        ...
    }
    ...
}
4

2 回答 2

4

Ballerina 程序预计会生产和消费网络服务,这些程序很容易引入安全漏洞,例如 SQL 注入、未经验证的重定向等。因此,Ballerina 语言的设计旨在使 Ballerina 程序在设计上是安全的。这种语言设计包括污点检查和传播以及集成的身份验证和授权架构。

的参数get()被修饰为安全敏感的,因此 Ballerina 编译器不允许将“不受信任的数据”传递给该函数。不受信任的数据可能来自程序参数、HTTP 请求、文件等。请参阅“如何编写安全的 Ballerina 程序”以了解有关此主题的更多信息。

在这里,在您的示例中,req.rawPath可能包含受污染的值,因此 Ballerina 编译器将不允许您将此受污染的值传递给敏感参数。在将受污染的值传递给敏感参数之前,您需要执行显式数据清理。有两种方法可以做到这一点。

方法一:

string rawPath = untaint req.rawPath;
var studentInfoResp = studentInfoEP->get(rawPath);

注意untaint这里的关键字。您可以使用 . 简单地将受污染的值标记为安全的untaint unary expression

方法二:

string rawPath = sanitizePath(req.rawPath);
var studentInfoResp = studentInfoEP->get(rawPath);

sanitizePath函数通过使用@untainted注释装饰返回类型来验证路径并返回未污染的值。

function sanitizePath(string rawPath) returns @untainted string {
    string value = rawPath;
    // Validate the path value and return
    return value;
}
于 2018-05-24T02:12:02.940 回答
2

HTTP 客户端调用中的路径参数被指定为安全敏感的。将不受信任的数据传递给安全敏感参数时,编译器会生成错误

“untaint”一元表达式可用于表示过程值是可信的。但必须进行适当的数据验证以确保输入不会导致安全威胁。

var studentInfoResp = studentInfoEP->get("/student" + untaint studentId);
于 2018-05-24T02:11:33.377 回答