Ваша думка про те, що код є витоком у безпеці, може бути, а може бути істинним, залежно від мови, якою ви користуєтесь. У коді C це може бути проблемою (особливо, тому що в C булевий символ - це лише int, який не дорівнює нулю або нулю) - але в більшості сильно набраних мов (тобто перевірка типу виконання), якщо passwordCheck
змінна була оголошена булевою, немає способу призначити щось інше. Насправді, усе в if
предикаті має відповідати булевому, будь то ви використовуєте булеві оператори чи просто використовуєте значення. Якщо вам вдалося мати інший тип об'єктів, прив’язаний до passwordCheck
виконання, викине якийсь тип незаконного виключення.
Прості конструкції if / else читаються набагато простіше, ніж якщо / if конструкти, - і менш схильні до випадкових проблем, якщо хтось намагається перевернути конструкцію. Візьмемо той самий приклад на секунду:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
Значення взаємовиключних статей, які ви хочете виконати вище, втрачається. Ось що передає конструкція if / else. Дві взаємовиключні гілки виконання, де завжди працюватиме одна з них. Це важлива частина безпеки - переконатися, що letThemIn
після виклику немає шляху denyAccess
.
З метою ясності коду та з метою забезпечення критичного розділів найбільш захищених, вони повинні знаходитися всередині основного пункту ( if
частини). Невідповідна поведінка за замовчуванням має бути в альтернативному пункті ( else
частині). Наприклад:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
ПРИМІТКА. У роботі з різними мовами я розробив габіт кодування, який допомагає уникнути питання "що, якщо це рядок?" По суті, це ставити константу спочатку в булевому виразі. Наприклад, замість перевірки passwordCheck == false
я перевіряю false == passwordCheck
. Це також дозволяє уникнути випадкової проблеми присвоєння, можливої в C ++. Використовуючи такий підхід, компілятор поскаржиться, якщо я вводить =
замість ==
. У таких мовах, як Java та C #, компілятор розглядає присвоєння в пункті if як помилку, але C ++ з радістю прийме його. Тому я також схильний робити нульову перевірку null
першим.
Якщо ви регулярно міняєте мови, ставлячи постійні першими, це дуже корисно. Однак у моїй команді це навпаки стандарту кодування, і компілятор все одно вирішує ці проблеми. Порушити це може бути важкий звик.