Открыть список
Как стать автором
Обновить

Комментарии 11

А почему пример плохого кода приведён для языка, который не поддерживается PVS-Studio? Неужели есть планы по добавлению PHP?
Неужели есть планы по добавлению PHP?

Ждёте? :)


А почему пример плохого кода приведён для языка, который не поддерживается PVS-Studio?

Хотелось найти примеры каких-нибудь уязвимостей (CVE), чтобы помимо описания самой уязвимости было и её представление в исходном коде. С C# в этом плане туговато, к сожалению — редко в базе CVE есть примеры C# кода (в отличии от того же PHP, например). Я в своё время даже заметку писал на эту тему: "Что не так с уязвимостями в C# проектах?"


Поэтому мы взяли один из примеров CVE на другом языке, прикинули, как аналогичное место выглядело бы на C# (одинаковый паттерн) и убедились, что PVS-Studio обнаруживает проблему.

Ну, ждать того, что не анонсировано, было бы странно 8) Если бы было реализовано, думаю, что запустили бы и посмотрели, тем более что статическими анализаторами PHP мы пользуемся. Кто знает, кто знает 8)
Если не секрет, какими анализаторами PHP вы пользуетесь?

Надеюсь, у вас эта диагностика не сделана по принципу "в коде переменная с именем password, инициализирующаяся хоть чем-то => поднимаем панику"? Так себя ведёт одна конкурирующая система, ругающаяся на код типа
private static String password = "";

Наше правило не ругается на такие случаи (когда password = "") и работает несколько более сложным образом :)
Например, пароль может быть передан в качестве параметра в какой-нибудь метод — V5601 найдёт это. Скоро выходит новая версия, где эта диагностика будет доступна — я бы посоветовал попробовать её в деле.

Так как всё таки сделано данное правило?

Как бы нам ни хотелось творить магию, чудес эта диагностика не делает :) V5601 рассматривает идентификатор, который связан с потенциально захардкоженными данными. Это может быть:

  • переменная/поле/свойство/параметр, куда записывается строковый литерал
  • параметр, в который передаётся строковый литерал
  • что-то, что сравнивается со строковым литералом через ==, switch, Equals и т.д.
  • название метода, возвращающего строковый литерал

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

Мне не понятно, по какому признаку строка признаётся конфиденциальной.

Проверяется идентификатор, с которым связана строка. Диагностика разбирает его на отдельные слова и ищет среди них различные ключевые фрагменты типа password и т.п.
Как я и говорил, чудес тут нет. Если Вам кажется, что алгоритм можно было бы как-то улучшить, то прошу поделиться этими идеями и возможно, они помогут нам сделать диагностику лучше :)
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.