Говнокод в Unity: ошибки C# и криптостойкость

Пример 1: Неявное преобразование типов в проверке конфигурации

Рассмотрим фрагмент кода, где с помощью if-условия проверяется булево значение, полученное из строки:

// Плохой код
if (someString) { ... } 

Проблема: Отсутствует явная проверка типа и обработка потенциальных ошибок. Если someString не содержит «on», результат непредсказуем, что может привести к ошибкам на этапе выполнения. Отсутствует формализация допустимых значений («on» и «off»).

Улучшенный код:

  1. Предусловие: Функция работает только со строками «on» или «off». Другие значения считаются ошибкой.
  2. Конфигурация: Статический класс Config со статическим методом, определяющим ключевые слова («on», «off»).
  3. Явное сравнение: Замена неявного преобразования на явное сравнение с использованием ==.
  4. Переименование метода: Из CheckBool в ConvertFlag для ясности.
// Улучшенный код
public static class Config
{
    public static string OnKeyword { get; } = "on";
    public static string OffKeyword { get; } = "off";

    public static bool ConvertFlag(string flag)
    {
        if (flag == Config.OnKeyword) return true;
        if (flag == Config.OffKeyword) return false;
        throw new ArgumentException("Invalid flag value"); 
    }
}

Пример 2: Неэффективная генерация случайной строки

Этот пример рассматривает метод генерации случайной строки из декомпилированного кода игры «Копатель Онлайн». Инициализация массива символов выполняется вручную, используется стандартный Random (не подходит для криптографически безопасной генерации), а конкатенация строк с помощью оператора + неэффективна.

Проблемы:

  • Ручная инициализация массива символов.
  • Использование некриптостойкого генератора случайных чисел (Random).
  • Неэффективная конкатенация строк с помощью оператора +.

Улучшенный код (вариант 1: с использованием Base64):

Вариант использует криптографически безопасный генератор случайных чисел и кодирование Base64 для получения случайной строки.

using System.Security.Cryptography;

// ...

public static string GenerateRandomString(int length)
{
    using (var rng = RandomNumberGenerator.Create())
    {
        var bytes = new byte[length];
        rng.GetBytes(bytes);
        return Convert.ToBase64String(bytes);
    }
}

Улучшенный код (вариант 2: с белым списком):

Вариант позволяет задать белый список разрешенных символов (полезно, например, для генерации паролей с ограничениями).

using System.Security.Cryptography;
using System.Text;

// ...

public static string GenerateRandomString(int length, string allowedChars)
{
    using (var rng = RandomNumberGenerator.Create())
    {
        var sb = new StringBuilder();
        var allowedCharsBytes = Encoding.UTF8.GetBytes(allowedChars);
        var allowedCharsLength = allowedCharsBytes.Length;

        for (int i = 0; i < length; i++)
        {
            var randomIndex = rng.Next(0, allowedCharsLength);
            sb.Append(allowedChars[randomIndex]);
        }

        return sb.ToString();
    }
}

Разбор примеров демонстрирует важность правильных подходов к обработке данных и генерации случайных чисел, особенно в контексте безопасности. Правильная формализация, использование криптостойких алгоритмов и оптимизация кода – ключевые аспекты написания качественного и безопасного программного обеспечения. Четкое понимание требований и ограничений (например, наличие белого списка символов) позволяет создавать более надежные и гибкие решения.

Что будем искать? Например,программа