#121

Опасность девелоперских костылей в продакшне

В девелопменте всегда есть соблазн временно отключить проверку паролей. Типичный вариант:

function authorizeUser(username, password) {
  if (isDevelopment) {
    return true;
  }
  // ...
}

Очевидно же, что в продакшне isDevelopment никогда не станет истиной, потому что не так написано в конфиге.

И тем более обидно, когда это неизбежно происходит. Стоит один только раз этому коду сломаться — и ты будешь готов на что угодно, чтобы только вернуть время вспять.

Поэтому никаких if (isDevelopment). Постели себе дополнительную соломку:

function authorizeUser(username, password) {
  if (
    isDevelopment
    &&
    md5(today + db.host) == env.PASSWORD_SKIP
  ) {
    return true;
  }
}

Можешь с утра выставить переменную окружения PASSWORD_SKIP в нужное значение и приступить к работе.

echo -n  "2019-01-21""localhost""sirko" | md5sum -

В продакшн такая переменная никогда не попадет, а если и попадет, то никогда не примет нужное значение.

Важный момент #0: нельзя просто проверять if (env.PASSWORD_SKIP), потому что так ты проверяешь просто наличие переменной окружения. Вероятность того, что она появится в продакшне — мизерная, но не нулевая. Вероятность, что она совпадет с контрольной суммой от дня и имени базы — ноль.

Важный момент #1: вычислять ее значение нужно обязательно вручную. Как только ты засунул это в скрипт - он рано или поздно запустится в продакшне.

Важный момент #2: обязательно нужна дата, чтобы правильное значение не было вечным. Так ты сокращаешь себе во времени площадь уязвимостей.

Важный момент #3: нельзя делать if (password == 'секретное слово'). Это потенциально эксплуатируемо в продакшне и следовательно это дыра. Слили твой код — получили доступ ко всем аккаунтам, а ты в это время ночью спал.