Перевірка введення даних - Де? Скільки? [зачинено]


28

Перевірка введення даних завжди була для мене досить внутрішньою боротьбою.

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

За свої 5 років, як професійний розробник Java, я створив і вдосконалив свої персональні правила щодо перевірки введення даних та заходів безпеки. Оскільки я люблю вдосконалювати свої методи, я хотів би почути кілька ідей від вас, хлопці. Загальні правила та процедури є чудовими, і специфічні для Java.

Узагальнено, це мої вказівки (викладені в трирівневому стилі веб-додатків) з короткими поясненнями:

  • Клієнт 1-го рівня (браузер): мінімальна перевірка, лише незмінні правила (обов'язкове поле електронної пошти, повинен вибрати один елемент тощо); використання додаткової перевірки на зразок "від 6 до 20 символів" рідше, оскільки це збільшує технічне обслуговування змін (може бути додано, коли бізнес-код стабільний);

  • Сторона сервера першого рівня (обробка веб-комунікацій, "контролери"): у мене немає правила для цього, але я вважаю, що тут слід обробляти лише помилки маніпулювання та збирання / розбору даних (поле дня народження не є дійсною датою); додавання подальшої перевірки сюди легко робить це дійсно нудним процесом;

  • 2-й рівень (діловий шар): валідація твердих порід, не менше; формат вхідних даних, діапазони, значення, внутрішня перевірка стану, якщо метод не можна викликати в будь-який час, ролі / дозволи користувача та інше; використовувати якомога менше вхідних даних користувачів, за потреби витягнути їх знову з бази даних; якщо ми вважаємо отримані дані бази даних також вхідними, я би підтверджував їх лише у випадку, якщо деякі конкретні дані є досить ненадійними або пошкодженими в БД - сильне введення тексту робить більшу частину роботи тут, IMHO;

  • 3-й рівень (рівень даних / DAL / DAO): ніколи не вірив, що тут потрібна велика перевірка, оскільки лише доступний бізнес-рівень повинен отримати доступ до даних (перевірити, можливо, у деяких випадках, наприклад, "param2 не повинен бути нульовим, якщо парам1 є істинним"); проте зауважте, що коли я маю на увазі "тут" я маю на увазі "код, який отримує доступ до бази даних" або "методи виконання SQL", сама база даних є абсолютно протилежною;

  • база даних (модель даних): повинна бути максимально продуманою, сильною та самозабезпеченою, щоб максимально уникати невірних та пошкоджених даних у БД, з хорошими первинними ключами, зовнішніми ключами, обмеженнями, типом даних / довжиною / розміром / точність тощо - я залишаю тригери поза цим, оскільки вони мають своє приватне обговорення.

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

Отже, що ви думаєте з цього приводу? Протилежні думки? Чи є у вас інші процедури? Посилання на таку тему? Будь-який внесок є дійсним.

Примітка: якщо ви думаєте, як робити Java способи, наш додаток - Весна, заснована на Spring MVC та MyBatis (продуктивність та погана модель бази даних виключають рішення ORM); Я планую додати Spring Security як наш постачальник безпеки плюс JSR 303 (Hibernate Validator?)

Спасибі!


Редагувати: додаткові роз'яснення на 3-му шарі.


Моя порада - вивчити, як працює сплячий валідатор. Я не вважав, що JSR 303 є корисним для валідації, що починається протягом постійності, тоді як деякі мої правила доводилося виконувати задовго до наполегливості, оскільки у мене були ділові правила, які спиралися на базову перевірку. На мою думку, це працює для дуже близької моделі; можливо, я використовував його неправильно, але я ніколи не знаходив когось із досвідом, відмінним від мого.
Vineet Reynolds

@ Vineet Reynolds Я вже використовував його для перевірки форми з Spring MVC, це дійсно чудове поєднання. Я отримую перевірку на стороні сервера з дрібнозернистими повідомленнями без особливих зусиль, відповідної помилки відображається користувачеві. Я все ще повинен повністю перевірити його на сторонніх серверних об'єктах, не знаючи переваг. Погляньте на цю прикладну
mdrg

2
поставити занадто багато перевірки. EveryWhere чорт цих користувачів вводить @ #! ! @@!
Чані

Відповіді:


17

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

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

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


2
+1 абсолютно. Я збирався сказати те саме про ASP.NET MVC, але ти мене побив. :) Дійсно, нам потрібна лише валідація для того, щоб переконатися, що система залишається у дійсному стані. Решта валідації, як і клієнтська сторона, - це покращення юзабіліті та витрачання часу для користувача, тому це повинно бути головним напрямком. Послідовність є ключовою.
Райан Хейс

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

І впевнено, якщо перевірку можна легко відтворити через додаток, немає причин цього марнувати. На стороні сервера це легко, але на стороні клієнта без таких інструментів перевірки, як той, про який ви згадали, це стає дуже засмучуючим (тобто: писати багато коду перевірки JS, як і той, який ви написали на сервері) .
mdrg

10

У реляційній системі я розглядаю це як тришаровий підхід. Кожен шар обмежений наведеними нижче:

  • Презентація / інтерфейс користувача
    • проста перевірка вводу
    • не продовжуйте, якщо введення не в тому форматі
    • "ворота" клієнтські запити на сервер для зменшення зворотних поїздок, для кращої зручності використання та зменшення пропускної здатності / часу
  • Логіка
    • бізнес-логіка та авторизація
    • не дозволяйте користувачам робити те, що їм заборонено
    • обробляти "похідні" властивості та стан тут (речі, які будуть денормалізовані в базі даних)
  • Дані
    • важливий рівень цілісності даних
    • абсолютно відмовитись зберігати будь-які сміття
    • сама БД застосовує формати даних (int, дата тощо)
    • використовувати обмеження бази даних для забезпечення належних відносин

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

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


Я погляну на Носорога. Якщо вона може якось інтегруватися з Spring MVC форма перевірки, то набагато краще.
mdrg

8

• 3-й рівень (рівень даних / DAL / DAO): ніколи не вірив, що тут потрібна велика перевірка, оскільки тільки доступ до бізнес-рівня повинен отримати доступ до даних (перевірити, можливо, у деяких випадках, наприклад, "param2 не повинен бути недійсним, якщо парам1 відповідає справжньому") .

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

Він каже це краще за мене: http://softarch.97things.oreilly.com/wiki/index.php/Database_as_a_Fortress


Я погоджуюся з останнім шматочком цієї статті, напевно, я не прояснив себе в цій частині. Я оновив питання з додатковими подробицями. Спасибі!
mdrg

2

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

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

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

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


1

Два короткі загальні правила перевірки:

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

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

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