Подтвердить что ты не робот

Уязвимость вредоносного кода. Может отображать внутреннее представление, возвращая ссылку на изменяемый объект.

Привет, я получаю нарушение, как показано ниже:

Уязвимость вредоносного кода. Может отображаться внутреннее представление возвращение ссылки на изменяемый объект

в моем коде я написал вот так

public String[] chkBox() {
    return chkBox;
}

Как мы можем его решить.

4b9b3361

Ответ 1

Как указано в сообщении об ошибке, вы возвращаете внутреннее состояние (chkBox - скорее всего - часть внутреннего состояния объекта, даже если вы не показываете его определение)

Это может вызвать проблемы, если вы - например - do

String[] box = obj.chkBox();
box[0] = null;

Поскольку объект массива, как и все объекты Java, передается по ссылке, это также изменит исходный массив, хранящийся внутри вашего объекта.

То, что вы, скорее всего, захотите сделать, чтобы исправить это, - это простой

return (String[])chkBox.clone();

который возвращает копию массива вместо фактического массива.

Ответ 2

Предположим, что следующее:

  • Ваш класс делает что-то, что имеет значение с точки зрения безопасности или конфиденциальности, и что состояние chkbox каким-то образом используется в реализации классов его механизмов конфиденциальности/безопасности.

  • Метод chkBox() может быть вызван некоторым кодом, которому не доверяют.

Теперь рассмотрим этот код:

// ... in an untrusted method ...

Foo foo = ... 
String[] mwahaha = foo.chkBox();
mwahaha[0] = "Gotcha!"; // ... this changes the effective state of `Foo`

Возвращая ссылку на фактический массив, который представляет chkbox, вы разрешаете код, открытый для класса Foo, войти и изменить его состояние.

Это плохо с точки зрения дизайна (это называется "негерметичной абстракцией" ). Однако, если этот класс используется в контексте, где также может быть ненадежный код, это (метод chkBox()) является потенциальным ядром безопасности. Это сообщение о нарушении сообщает вам.

(Конечно, проверка кода не знает, действительно ли этот класс действительно критичен в безопасности. Это для вас, чтобы понять. То, что он на самом деле говорит вам: "Эй, смотрите здесь! Это подозрительно!" )


Исправление зависит от того, критичен ли этот код (или даже вся библиотека или приложение) критически важна... или код критически важны для некоторых будущих развертываний. Если это ложная тревога, вы можете просто подавить нарушение; т.е. отметьте его так, чтобы контрольная сумма была проигнорирована. Если это реальная проблема (или может стать реальной проблемой), то либо верните копию массива:

    return (String[]) chkBox.clone();

Но очевидно, что при каждом вызове chkbox существует стоимость производительности при клонировании массива. Кроме того, вы можете изменить метод chkbox, чтобы вернуть выбранный элемент массива:

    public String chkBox(int i) {
       return chkBox[i];
    }

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