Співробітник використовував найгірші практики програмування


37

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

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

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

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


4
Якщо ваше запитання стосується того, як впоратися з політикою цієї ситуації, то багато відповідей тут вказують у правильному напрямку, але якщо, як коментує ваш коментар, ви дійсно хочете запропонувати кращу альтернативу, запропонуйте, ви можете перевірити відповіді на це запитання: stackoverflow.com/questions/6018215/…
Mark Booth

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

2
Він перейменував місцевих жителів? Якщо це так, він витрачає час - вони все одно не існують як названі змінні у складеному коді.
Нік Джонсон

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

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

Відповіді:


94

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


31
+1 Заплутаність НЕ є безпекою, просто затишкою.
uɐɪ

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

5
Ви не можете гарантувати це взагалі, коли хтось отримав доступ до файлів. Але правда полягає в тому, що найпростіший механізм заважає 99,99% користувачів заподіяти шкоду вашому програмному забезпеченню. Завзятий і кваліфікований хакер ВЖЕ знайде спосіб обійти безпеку програми. Однак ви можете переключитися на віддалену перевірку, тому ваша програма запускатиметься лише після автентифікації на вашій службі. Для того, щоб це було безпечно, вам потрібно зашифрувати всю вашу програму і мати якийсь завантажувач. АЛЕ: якщо хтось отримав дійсний ключ, він все одно може повернути інженеру програмне забезпечення.
Falcon

7
@Neil: реалізуйте основну логіку бізнесу в мікроконтролері, приєднаному як USB-ключ. Ви не сказали, що це повинно бути дешевим чи простим у виконанні;)
SF.

8
@SF .: Touche. Я думаю, що для того, щоб одночасно зв’язатись, потрібно мати три супутники, просто для чорта. ;)
Ніл

84

Оригінал: Що каже ваш начальник? Дізнайся - зроби це.


Мене попросили розробити вищезазначене:

Перш за все, я думаю, що у вас є не одна дилема:

  • Чи варто "виправити" код інших осіб?
  • Чи достатньо поганим є реалізація (звідси A) інших осіб, що її слід замінити чимось іншим?
  • Чи буде обфускатор (звідси B) кращим для цього "вбудовування ліцензій у нашу заявку"?

Перш за все, видно з ділового випадку проблема ІС вирішена. Це місце є і, швидше за все, є "досить хорошим" рішенням проблеми. Ваша компанія може бути задоволена цим, в основному просто захищеним, що для її розриву необхідно навмисні зусилля.

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

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

Іншими словами: Що говорить ваш начальник? Дізнайся - зроби це.

Зауважте також, що це було б інакше, якби ви піднімали цю проблему раніше, щоб витрачені гроші на витрачений час на реалізацію А були меншими. Іншими словами, коли вибір між A і B мав бути зроблений.

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

Сподіваюсь, це пояснює мою точку зору.


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

15
@Neil: ... то, можливо, настав час познайомити свого начальника з поняттям "витрати на обслуговування"?
СФ.

21
Чи стане це відповіді за замовчуванням на кожне запитання про колег чи робоче середовище? Я знаю, що якийсь нуб повинен був піти і сказати вам, щоб це було як відповідь, але давай, це не відповідь. Це насправді напівпристойне (хоч і незграбно) питання щодо проблем із безпекою через неясність; ця "відповідь" є образливою.
Aaronaught

8
@Aaronaught. Ця відповідь скорочується до кісток, коли це "реалізація A погана, я пропоную зробити B", тому що потрібно виконати додаткову роботу (що дорівнює грошам). Якби це був вибір між реалізацією A або B, відповідь була б іншою. Я пропоную вам відкрити запитання щодо мета, якщо ви хочете більш детальну відповідь.

22
"Чи це стане відповіддю за замовчуванням на кожне запитання про колег чи робоче середовище?" Чому ні? Якщо це було охарактеризовано як технічне запитання. Все "Чи варто це виправити за колегами назад?" питання зрештою зводяться до "Ні, доведіть до відома команди / вищої сили"
Binary Worrier

13

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

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

Ви виховували це з програмістом, ваш наступний крок - це утримати ніс від нього або виховувати його з управлінням, а потім утримувати ніс від нього.


Тоді, коли в майбутньому я буду ловити рибу через ці заняття, я просто затримаю ніс.
Ніл

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

6

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

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

Завжди зустрічайтеся з цими речами вперед - але політично і по-доброму.


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

2

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

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


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

2

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

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

RE: переробка його коду: це лише питання перейменування? У багатьох ІДЕ є інструменти рефакторингу, які дозволяють це зробити досить легко.


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

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

2
@Tundey, справа не в підкласах (як би їх завантажувати?): Справа в тому, щоб написати той самий клас і помістити зламану версію раніше в список пошуку classpath.
Пітер Тейлор

1
ha. Я пам’ятаю радощі завантаження класу на Java. Але все ж повинен бути кращий спосіб пом'якшити проти цього. Насправді, якщо ваш завантажувач класів не порушений, як хтось може написати клас, такий же, як ваш клас? Особливо, якщо ваш JAR підписаний? Чи не підписання ваших JAR та закріплення класів вирішить проблему того, що хтось пише клас із таким же ім’ям, як і ваш?
Тундей

1
@Tundey Sun JVM є (здебільшого) відкритим кодом, ви можете його змінити.
Spudd86

2

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

Ваша проблема полягає в тому, як захистити свій IP. Знайдіть рішення для цього: обфускатори, сервер ліцензій тощо.


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

1

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


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

1
@Neil Тоді я б запропонував, що ти потребуєш зміни в голові. Якщо код працює, має адекватне тестування, і він добре коментує перехід цього маршруту замість використання та обфускатора - не найкращий вибір, але також не кінець світу. Виправте це пізніше, якщо це проблема, і просто перейдіть інакше.
Крістофер Біббс

@Christopher_Bibbs: Розслабте свою думку. Я майже напевно можу запевнити вас, що це, власне, і поставить проблему з часом.
Ніл

1

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

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

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


0

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

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


0

"Не будьте найвищим професіоналом, який знає про проблему".

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

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


0

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

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

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

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

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