Як я можу змусити програмістів припинити писати код, вразливий до ін'єкції SQL?


11

Іноді ви зайняті і делегуєте невеликі завдання молодшим програмістам. Але якщо ви не приділяєте належної уваги, ви опинитесь з таким кодом у виробництві:

class DivtoggleController extends Zend_Controller_Action {

    public function closeAction() {
        /* ... code removed for brevity ... */

        $req = $this->getRequest();
        $formData = $req->getPost();

        $d = $formData['div'];
        $i = $formData['id'];

        $dm = new Model_DivtoggleManager();
        $rs = $dm->setDivToggleById($d, $i);

    }

}


class Model_DivtoggleManager extends Zend_Db_Table {

    public function setDivToggleById($div, $id) {
        $result = $this->getAdapter()->query(
           "update div_toggle set " . $div . "=1 where id=" . $id
        );
    }

}

Отже, враховуючи, що я видалив логіку управління автентифікацією / сеансом для стислості, хто може мені сказати, яка можлива проблема може бути з цим зразком?


Чому це не зберігається в простому файлі cookie?
Темна ніч

1
@Darknight, ви припускаєте, що відбудеться сеанс зберігання файлів cookie. Існує чи ні, не має значення для більшої проблеми безпеки.
Роджер Халлібуртон

Відповіді:


24

Ви можете їх навчити. Кожен робить це на початку, навіть ти. Якщо цей тип коду робить його виробництвом, це винні старші люди; не молодший.

Редагувати:

Одним із речей, які я зробив, є те, що я особисто взявся активно просити людей переглянути мій код (включаючи юніорів) перед випуском. Код переглядають, молодші люди сприймають це як досвід навчання, люди втрачають страх перед переглядом коду як покарання, і вони починають робити те саме.


2
+1 Домовитись. Ви не можете звинувачувати молодшого програміста (імовірно), оскільки ви припустили, що рівень знання у них може не бути. (Тим НЕ менше, ви б хотіли , щоб думати про такі проблеми добре відомі в цей день і вік Тоді знову, я б. Хотів би думати , що я був талановитий і добре виглядає, і т.д.) :-)
Джон Паркер

Досить справедлива заява. Напевно, мені слід задати подальше запитання, запитаючи, чому керівництво наполягає на запуску коду у виробництво, який не було схвалено старшими програмістами. Чи ризикую я працювати через незначну проблему безпеки?
Роджер Халлібуртон

1
@Roger Halliburton: Ну, якщо це проблема безпеки дійсно яким - то чином отримати експлуатували, що найгірше , що могло статися? І чому вказівка ​​на проблеми безпеки обійшлася вам у вашій роботі? Чи не хоче керівництво цим займатися?
FrustratedWithFormsDesigner

1
@Roger - це лише другорядне значення, поки вас не зламають. :) Я думаю, що введення коду у виробництво без огляду (незалежно від рівня розробника) - це невдача. На жаль, це дуже поширена практика у багатьох компаніях; і, імено, зазвичай потрібні основні $ 4! т, перш ніж управління почне оцінювати такі речі, як огляди коду.
Джон Крафт

1
@Roger: Весь код слід переглянути, а не лише код, написаний "молодшими" програмістами. Навіть старші програмісти роблять помилки.
Дін Гардінг

20

Зламіть їх код перед очима, а потім покажіть, як це виправити. Знову і знову, поки вони не зрозуміють.


4
Щоранку пишіть їм по електронній пошті: "До речі, минулого вечора я знову скинув вашу базу даних через іншу вразливість ін'єкцій SQL, яку ви залишили у своєму коді. Я знаю, як вам подобається відновлення резервних копій бази даних!: D"
Ant Ant

2
@Ant: Будь приємний. Зробіть це незабаром після запланованого резервного копіювання, а не незадовго до цього.
Стипендіати доналу

@Donal: зробіть це незабаром після резервного копіювання, потім скажіть їм, що резервне копіювання не вдалося, і дайте їм потіти протягом усього дня, перш ніж відновити резервну копію протягом ночі.
jwenting

8

Ви можете доручити їм проходити клас, як тільки вони приєднаються до вашої компанії, перш ніж вони матимуть доступ до контролю джерела, що вводить їх до ін'єкцій SQL, сценаріїв міжміських сайтів, підробки міжпрофільних веб-сайтів та інших загальних уразливостей. Обкладіть приклади віч-на-віч, порушіть поганий код перед ними, попросіть їх порушити поганий код і вкажіть їх на сайт OWASP для отримання додаткової інформації, як тільки вони закінчать.

Ви можете додатково доручити використання спеціальної бібліотеки, яка займається цим для вас, але це лише вторинне рішення, оскільки вони обов'язково запускають власні запити, коли це стане зручнішим.

Якщо у вас є ресурси, переконайтеся, що більш старші члени команди перевіряють їхні відмінності перед тим, як зробити це, також можуть бути корисними.

Знання це сила!


3
Краще відмивати їх, перш ніж вони приєднаються до вашої компанії Якщо ви наймаєте когось, щоб написати що-небудь, що використовує SQL, не задаючи питання про інтерв'ю щодо ін'єкційних меж щодо некомпетентності.
Wooble

Я, як правило, погоджуюся, але дуже розумний та амбітний прокат юніорів - це набагато, набагато дешевше, ніж "розробник PHP з N-річним досвідом", що не гарантує, що це набагато краще. Розумні молодші розробники можуть дуже швидко підібрати цей матеріал і стати досить корисним.
Янв

3

Якщо припустити, що це невпевненість, до якої зверталися інші, як розробник будь-якого рівня, легко забути, що getPost () не забезпечує безпеку даних спочатку.

Одним із способів цього є:

  1. Напишіть клас, який отримує всі дані POST / GET, і запишіть його як клас Singleton, який називається "insecure_data". Потім очистіть масиви POST / GET.
  2. Розробникам, ніж доводиться отримувати дані POST / GET з масиву 'insecure_data', а не масиви POST / GET.

Будь-який розробник, який витягує щось із масиву під назвою "insecure_data" і не намагається захистити його, є невідомим або ледачим. Якщо це перший, забезпечте навчання, після чого він повинен бути другим - і тоді у вас є дисциплінарне питання, а не програмування.


Нічого собі, це непотрібно заплутане і все ще не вирішує проблему. Справа не в тому, щоб вичистити введення тільки для розваги, а не для очищення даних, які ви вводите в базу даних, і щоб теоретично вони могли надходити з будь-якого місця, з веб-форми, електронної пошти чи XML-документа, який хтось завантажує. У всіх цих випадках вам потрібно вичісувати, коли він переходить до бази даних.
Роджер Халлібуртон

@RogerHalliburton Звичайно , це не вирішує всі, але це поняття (свого роду шаблон проектування, якщо ви будете) , а не повністю конкретизовані заходи безпеки , щоб небезпечні дані дивитися незахищені.
Ден Удар

А, бачу. Але ти просто борешся з людською природою, якщо ти кажеш кому-небудь "Цей об'єкт небезпечний, якщо він не позначений як безпечний", і вони намагаються використовувати його для чогось, більшість часу вони позначають його як безпечний, фактично не перевіряючи. Ну, насолоджуйтесь підвищенням репутації.
Роджер Халлібуртон

З точки зору молодшого розробника, просто побачення $ insecure_data піднімає прапор таким чином, що просто бачення $ postdata (або будь-чого іншого) цього не робить. Ідея походить від фільму Джоела Спольського "Зробити неправильний код невірним" . Якщо людська природа ваших розробників така, щоб ігнорувати цей червоний прапор, то вам або потрібно провести багато тренувань, або отримати нових розробників.
Ден Удар

Я не тримаю Спольського на п’єдесталі. Це розробники, які легко ігнорують непослідовні вкладки, вони не збираються двічі замислюватися над тим, щоб використовувати щось, що називається "небезпечним".
Роджер Халлібуртон

1

Один з найкращих посібників, які я прочитав про безпеку в Інтернеті, - це посібник із безпеки Ruby on Rails . Хоча це Ruby on Rails, багато концепцій стосуються будь-якої веб-розробки. Я б закликав будь-кого нового, щоб прочитати цей посібник.


2
Усі знають, що Рубі не захищена.
Роджер Халлібуртон

5
@Roger: "Всі знають" всілякі речі, які можуть бути або не бути правдою. Я виступаю за реалістичний підхід до програмування, а не на основі чуток.
Стипендіати Доналу

0

Код, який ви зв'язали вище, піддається атаці ін'єкції SQL, оскільки входи HTTP, які ви використовуєте в запиті, не були очищені mysql_real_escape_stringіншими способами.


1
о, я думав, ми відповідаємо на це як тестове запитання:]
Райан,

Downvotes трохи кульгавий, оскільки формулювання запитання було змінено на наступний пост: P
Ryan

0

З точки зору вашого (імовірно, переважаючого) "як я можу змусити програмістів перестати займатися цим питанням", я б сказав, що наставлюючи їх регулярно, ретельно пояснюючи питання, про яке йдеться (і потенційні випади тощо), і підкреслюючи важливість вразливості коду (як з точки зору інжекцій SQL, так і з крос-сайтового сценарію тощо), мабуть, є найбільш розумним рішенням.

Якщо вони не зважають на все вищезазначене (можливо, ви захочете кинути погляд на їхні зобов’язання тощо), а не виявляти "наживо"), то проблема полягає в тому, що ви їх не дотримуєтесь як наставника, або це їм, можливо, потрібно знайти щось більш придатне для життя.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.