在 Ballerina 服务中调用后端时传递动态请求路径

Passing dynamic request path when calling backends in Ballerina service

我正在尝试动态传递后端请求的路径。但是路径变量是敏感参数,因此不允许我传递传入路径或任何字符串,如 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);
        ...
    }
    ...
}

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

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

var studentInfoResp = studentInfoEP->get("/student" + untaint studentId);

Ballerina 程序预计会产生和使用网络服务,这些程序很容易引入安全漏洞,例如 SQL 注入、未经验证的重定向等。因此,Ballerina 语言的设计方式使 Ballerina程序在设计上是安全的。这种语言设计包括 taint checking 和传播以及集成的身份验证和授权体系结构。

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

此处,在您的示例中,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 注释装饰 return 类型来验证路径和 return 未受污染的值。

function sanitizePath(string rawPath) returns @untainted string {
    string value = rawPath;
    // Validate the path value and return
    return value;
}