Я новичок в балерине. Я хочу получить пользовательский параметр из командной строки и установить для него полезную нагрузку json. Что-то вроде этого:

ballerina run client.bal testInput

Ниже мой client.bal

endpoint http:Client clientEndpoint {
    url: "http://localhost:9090"
};

function main(string... args) {
    http:Request req = new;
    string userInput = args[0];

    json jsonMsg = {input: userInput};
    req.setJsonPayload(jsonMsg);

Но когда я это делаю, я получаю ошибку компиляции: испорченное значение передается в чувствительный параметр 'payload'.

Я пытался выполнить проверку следующим образом, но все равно получаю ошибку.

string userInput = "empty";
if(!(args[0] == "")) {
    userInput = args[0];
}

Кто-нибудь знает обходной путь для этого.

2
Madhuka Wickramapala 25 Сен 2018 в 13:32

2 ответа

Лучший ответ

Неприятное унарное выражение - это быстрый способ исправить здесь ошибку компиляции. Но правильный подход - правильно выполнить проверку содержимого, прежде чем оно будет передано в защищенную функцию.

Например, у нас может быть функция проверки / дезинфекции, которая принимает испорченное значение и возвращает незапятнанное значение после выполнения некоторой проверки, как показано ниже.

function validate(string input) returns @untainted string {
    string regEx = "[^a-zA-Z]";
    return input.replace(regEx, "");
}

В приведенном выше примере, используя аннотацию @untainted, мы можем пометить возвращаемое функцией значение как незапятнанное значение. Теперь это значение можно напрямую передать в защищенную функцию, которая ожидает незапятнанное значение. Итак, мы можем переписать ваш пример, как показано ниже.

import ballerina/http;

endpoint http:Client clientEndpoint {
    url: "http://localhost:9090"
};

function main(string... args) {
    http:Request req = new;
    string userInput = validate(args[0]);
    json jsonMsg = {input: userInput};
    req.setJsonPayload(jsonMsg);
    // rest of the program
}

function validate(string input) returns @untainted string {
    string regEx = "[^a-zA-Z]";
    return input.replace(regEx, "");
}

Вышеупомянутая функция проверки является только примером. Но в зависимости от требования мы можем написать функцию, которая будет выполнять фактическую проверку и возвращать защищенный контент. Дополнительная информация доступна по адресу: https://ballerina.io/learn/by- пример / порча - checking.html

3
Kishanthan 25 Сен 2018 в 18:00

Я искал о проверке порока балерины. Параметр пути в вызове HTTP-клиента обозначен как чувствительный к безопасности. Компилятор выдает ошибку, когда ненадежные данные передаются в чувствительный к безопасности параметр.

Унарное выражение "untaint" может использоваться для обозначения того, что исходное значение является доверенным. Но важно провести правильную проверку данных, чтобы убедиться, что ввод не создает угрозы безопасности.

Поэтому мы можем исправить ошибку компиляции вот так.

json jsonMsg = {input: untaint userInput};

Но важно всегда проверять вводимые данные. Ура !!!

2
Madhuka Wickramapala 25 Сен 2018 в 11:23