Подтвердить что ты не робот

Необходима бомба времени в приложении ASP.NET

Мы разработали специальное приложение ASP.NET для использования в нашей клиентской интрасети. Похоже, что они вряд ли будут платить за это, поэтому наш босс хотел бы, чтобы мы представили бомбу замедленного действия.

[Изменить:] Технические ответы только пожалуйста! Является ли это хорошей (или юридической) идеей, является вопросом для CEOoverflow.com; -)

Все страницы приложения наследуются от класса ApplicationBasePage и имеют согласованную обработку ошибок, поэтому я думаю, что выброс исключения на раннем этапе жизненного цикла ApplicationBasePage будет простым способом сделать приложение непригодным. Я открыт для других идей, которые у вас могут быть, хотя.

Мой вопрос: как и где мы должны хранить дату истечения срока действия приложения?

Некоторые примечания:

  • Приложение установлено на одном сервере в офисах клиентов.
  • Данные приложения хранятся в базе данных SQL Server 2005, хранящейся на том же сервере. База данных была разработана нами и не используется ни для чего другого.
  • Приложение доступно только в своей интрасети: доступ к приложению через Интернет отсутствует.
  • В настоящее время у нас есть доступ к удаленному рабочему столу на их сервер, но он будет ожидать, что если все станет неприятно,
  • Приложение написано на .NET 2.0.
  • Безопасность обрабатывается FormsAuthentication.
  • Нам нужно иметь возможность быстро отключить timebomb или изменить дату его запуска (предположим, что у нас есть доступ к удаленному рабочему столу для этого).
  • Сервер может нормально обращаться к Интернету, но лучше не полагаться на это.
  • Timebomb будет блокировать пользователей: он не уничтожит никаких данных.
  • Если это не срабатывает, клиент никогда не должен знать о существовании временной бомбы.
  • Их ИТ-парень будет с удовольствием заглядывать в web.config или в базу данных. Он не программист, но он не боится менять вещи "просто посмотреть, что происходит". Декомпиляция или обратное проектирование приложения будет за пределами его возможностей.

Для дополнительного кредита, насколько вы думаете, что в этом случае можно полагаться на безопасность через неясность?

[ Edit:]

  • В приложении много важных для бизнеса событий, зависящих от бизнеса, поэтому мы можем быть уверены, что они не изменят часы на своем сервере, так как это сделает приложение хуже, чем бесполезно.
4b9b3361

Ответ 1

Спасибо за все ваши ответы!

Мы не совсем сделали то, что предложил какой-либо человек, но использовали идеи нескольких из вас.

Во-первых, мы перестали называть это бомбой замедленного действия и назвали ее лицензией. Поскольку программное обеспечение (возможно) неполное в настоящее время, и поскольку клиент не заплатил за него, мы можем назвать его тестовой версией, которая истекает. Это (возможно) заставляет нас пройти большую часть легального минного поля и (как указал zsharp), если они утверждают, что продукт не соответствует стандартам, они не могут действительно жаловаться, если они не могут его использовать.

Во всяком случае, техническая реализация выглядит следующим образом:

Мы хотели, чтобы дата истечения срока действия была скрыта там, где она не была бы наткнута, и если бы она была замечена, то она была бы в форме, которая не была бы легко модифицируемой. Это также должно было быть где-то, где мы могли быть уверены, что это не повлияет непреднамеренно, даже несмотря на то, что на сервере у нас нет такого большого контроля.

Итак, мы зашифровали дату истечения срока действия и поместили ее в расширенное свойство в базу данных, используемую приложением, придав ей подходящее вводящее в заблуждение имя.

Приложение проверяет ключ при запуске, устанавливая для статического булевского флага значение true, если приложение не истекло. Каждая страница сайта проверяет этот флаг и отскакивает пользователя на странице ошибки, если флаг имеет значение false.

Мы удовлетворены этим решением по следующим причинам:

  • Нам легко изменить дату истечения срока действия приложения.
  • Нельзя полагаться на доступность Интернета и ничего другого за пределами их сервера.
  • Защита выдержит резервные копии и восстановление, или приложение будет перемещено в другое поле.

Когда аргументы прекратились, они заплатили нам, и мы все снова друзья, следующее обновление до их приложения не будет вообще проверять его, гарантируя, что этот забытый фрагмент кода не будет случайно вызванный в несколько лет спустя (спасибо, Кристен!).

Ответ 2

"Они вряд ли будут платить за это, поэтому наш босс хотел бы, чтобы мы представили бомбу замедленного действия".

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

Это неэтично, возможно, незаконно, но в основном это просто глупо.

Ответ 3

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

Чтобы выполнить проверку, мы храним "регистрационный ключ" в файле web.config. Мы сравниваем это с ключом, который мы вычисляем, а алгоритм его вычисления хранится в отдельной сборке. Если ключи совпадают, мы предполагаем, что продукт лицензирован.

Для нашего использования мы предоставляем только имя клиента для алгоритма калибровки ключа регистрации, но вам может потребоваться добавить номер версии или другую дату. Затем регистрационный ключ генерируется путем вычисления хеша MD5 из предоставленного имени в сочетании с секретным кодом (некоторые случайные байты в массиве).

Это отнюдь не глупое доказательство или очень твердое, но оно простое и достаточно для нашего использования.

Ответ 4

Ну вот некоторые вещи, о которых я могу думать

  • Поместите логическую бомбу, которая зависит от того, кто входит в ваш пользователь, поэтому в течение определенного количества дней последнее приложение для входа закрывается.
  • Использовать блокировку на основе даты и хранить дату в таблице на SQL-сервере. Но зашифруйте значение, хранящееся с использованием стандартного алгоритма, который использует соль, зарытую в вашем коде. Таким образом, вы избегаете раскрывать дату для sys-admin.
  • Используя вышеприведенный метод, храните большое целочисленное значение, из которого вы обратный отсчет, как только приложение загрузится в IIS - как только оно достигнет нуля, удалите значение в db и заблокируйте приложение - вам придется reset значение используя ваше шифрование, чтобы оно снова работало.
  • Защита от неизвестности прекрасна, если это приложение, но если вы хотите продать это как продукт, тогда вам понадобится какое-то шифрование.

Ни один из них не является надежным, хотя...
Отказ от ответственности: я не являюсь экспертом по правовым вопросам - я ответил только с технической точки зрения. Я лично не сделал бы этого, так как считаю это морально неоднозначным.

Ответ 5

Я действительно не вижу сценариев, где это закончится хорошо. Если вы беспокоитесь о том, что вам платят (и они, по-видимому, беспокоятся о том, чтобы заплатить за приложение до его поставки), как насчет создания какого-то депонирования? Они ввели платеж в условное соглашение с взаимно согласованными положениями о выпуске денег, а затем продолжайте работу, зная, что деньги были отложены до конца.

Ответ 6

Отметить этические проблемы в стороне, если вы беспокоитесь о том, что реализация серийного номера взломана, почему бы не использовать сертификат X509? Если, например, у вас есть окно Windows с установленным сервером сертификатов, он может открыть список отзыва сертификатов в Интернете.

Выдать каждому клиенту сертификат идентификации клиента (бонус, если вы отправляете проверку обновлений на центральный сервер - теперь вы можете использовать HTTPS клиента/сервера, не беспокоясь о паролях).

Если клиент не платит, то отозвать сертификат. В процессе запуска приложения просто загрузите сертификат и проверьте его достоверность...

Ответ 7

Есть ли у их веб-сервера доступ к Интернету? Вы можете использовать веб-службу для запуска бомбы замедленного действия в дополнение к другим методам, так как хитрый системный администратор может пожелать установить часы на сервере несколько лет назад.

Ответ 8

Несколько пунктов для рассмотрения:

Это даже законно? Предполагая, что вы не планируете раскрывать это пасхальное яйцо: "Если это не срабатывает, клиент никогда не должен знать о существовании временной бомбы", вы можете столкнуться с некоторыми юридическими проблемами...

Если у клиента есть доступ к источнику, я не могу представить, как вы могли бы включить что-либо, что они не могли нанять разработчика для удаления. Даже если ИТ-разработчик не является разработчиком, он не может позволить себе нанять другого разработчика, чтобы перепроектировать код.

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

Ответ 9

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

Единственный правильный способ - сделать приложение зависящим от какого-либо компонента, которым вы владеете, например, может потребоваться активация через некоторое время или пинг на ваш веб-сервер.

Это может быть достигнуто путем установки даты установки и использования ее как своего рода соли/криптографического ключа и шифрования всех данных с ним. Затем вы можете сравнить с этой датой установки. Если клиент закручивает его (установка часов назад), вы заметите это, так как у вас установлена ​​первоначальная дата установки. Если они изменят дату, это также изменит криптографический ключ, и, следовательно, данные больше не могут быть расшифрованы.

По-прежнему существует способ, но с любым решением, основанным на времени, вам как-то нужно сохранить дату установки в качестве базы для сравнения, и вам нужно сделать это безопасным для возиться, следовательно, идея использования в некоторых типа шифрования для защиты всех данных с ним.

Ответ 10

Это звучит как работа для адвоката.

Кроме того, я бы использовал простой файл конфигурации, который содержит дату истечения срока действия. Затем сохраните зашифрованный RSA хэш этой даты в файле конфигурации. Если вы обновляете дату истечения срока действия, вы просто обновляете зашифрованный хеш. Приложение читает дату на регулярной основе и расшифровывает хэш с открытым ключом RSA, а затем проверяет хэш. Если они возится с датой, зашифрованным хешем или открытым ключом, приложение перестает работать.

Ответ 11

Две мысли:

1) Я бы разместил заявку для них за пределами площадки, пока они не заплатили, или пока они не поместили деньги в депонирование. Если они говорят, что это не работает и не будет платить, они не будут возражать, если вы отключите доступ, пока соглашение будет разобрано, будут ли они?!

2) Мы уже делали подобное. Мы потратили гораздо больше времени, учитывая, что любая возможная "бомба замедленного действия" будет на 100% пуленепробиваемой, чтобы она не удалялась случайно ни до даты отсечения, ни через какое-то время после "деконфигурации". Например, может быть лучше фактически удалить код, а не просто изменить флаг из "Пробный" на "Неограниченное использование"

Ответ 12

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

Ответ 13

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

Я получил бы жалобу в письменной форме, прежде чем вы попробуете какие-либо предложения здесь. (Я бы добавил, что маршрут "бесплатной пробной версии" кажется самым безопасным)

Ответ 14

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

Самый простой способ - сохранить дату в самой сборке как переменную. Если вы боитесь простой декомпиляции, зашифруйте его и сохраните ключ в сборке. Если вы считаете, что хотите изменить дату в будущем, сохраните ее в DB/web.config(зашифровано, конечно). Для шифрования вы можете использовать что угодно: от base64 до криптографии с открытым ключом. Очевидно, что это не помешает серьезной декомпиляции вашего кода... но это хорошо для начинающих.

На боковой ноте, тоже ли "логическая бомба" напоминает вам меч-меч?

Ответ 15

Зная введение "бомбы замедленного действия", как это, безусловно, является незаконным. Ваш босс не первый, кто его рассмотрит и не будет последним. Лучше всего остановить производство, пока не будет произведен платеж.

Ответ 16

Возможно, вы захотите предупредить своего босса, что если его клиент пострадает от каких-либо денежных убытков (включая потерю клиентов), ваша компания будет нести ответственность за эту потерю и, возможно, штрафы, а также за юридические сборы вашей компании. И, если компания не переживет судебный процесс и урегулирование, вы не будете работать.

Я бы подумал дважды, прежде чем просто идти вместе с этим, если бы я был вами.

Ответ 17

Как и многие другие, я бы сказал, не делайте этого. Я не знаю, является ли это незаконным, но это просто не так. Бизнес должен основываться на доверии, и открытое обсуждение должно иметь приоритет над такими схемами.

Расскажите о своих проблемах и заморозите развитие, если это необходимо - я предполагаю, что они хотят, чтобы продукт был в конце концов!

Ответ 18

Это довольно сложно, но вы можете просто написать запланированное задание, которое выполняет программу, которая объединяет все пароли. Он не разрушает данные, и до тех пор, пока у вас есть доступ, вы можете отключить задачу расписания. Кроме того, если что-то происходит, когда вы хотите дать им информацию обратно, это будет так же просто, как unsalting... desalting... passwords.

Как и во многих других, у меня бы были сомнения относительно фактического осуществления этого.

Ответ 19

Я бы применил какой-то метод в скомпилированной dll, который вы храните в каталоге bin. Назовите это чем-то другим, кроме timebomb.dll.

Затем вы должны иметь метод в этой DLL, который возвращает true или false:

public bool hasTimeExpired() {
  //Pseudocode
  DateTime expires = new DateTime(Janurary 10, 2009);
  return ( DateTime.Now() >= expires );
}

Просто проверьте метод hasTimeExpired() при запуске приложения (global.ascx??) или на определенных страницах кода в зависимости от того, как вы хотите обрабатывать сообщение об истечении срока действия.

dll в каталоге bin легко заменить новой скомпилированной версией, если вы хотите отключить timebomb или увеличить время. Его нужно было бы разложить, чтобы выяснить дату истечения срока, и было бы легко обойти, если они узнают, как это работает, но, как вы сказали, администратор, о котором идет речь, вероятно, не сделал бы этого.

Кроме этого, вам действительно нужно работать с Юристом, но иногда блокировка заимствованного программного обеспечения, подобного этому, более эффективна и дешевле, чем адвокат.

Ответ 20

Я не могу говорить с юридическими вопросами.

Технически я предположил, что вы можете это сделать. Создайте пару ключей и используйте закрытый ключ для шифрования файла с датой истечения срока действия. Ваше приложение будет использовать открытый ключ для дешифрования файла с датой истечения срока действия. Каждый раз, когда программа работает, на видном месте отображается что-то вроде "57 дней до истечения срока действия лицензии. Yada, yada". Таким образом, у них есть постоянное предупреждение о том, что приложение перестанет работать.

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

Трудно обойти системный администратор, который будет устанавливать часы. Но если у него есть сетевое соединение, вы можете получить его "домой по телефону", чтобы получить ключ, а не работать вообще, если он не сможет его получить.

Ответ 21

Переместите некоторую логику в веб-сервис на своих серверах. Пусть клиентское приложение будет зависеть от этого веб-сервиса. У меня есть веская причина переместить эту логику, например "Его основной бизнес, поэтому нам нужно это контролировать", сделать это изменение как часть "новой версии" программы.

Замените контракт с клиентом новым разделом, в котором говорится, что если они не платят, ваш веб-сервис будет отключен.

Если они не хотят подписывать контракт, они не хотят заниматься с вами бизнесом, и вы можете отключить веб-сервис для них, если они подпишут, они соглашаются с новыми условиями.

Это действительно единственный способ сделать это, если вы хотите быть уверены, что они не могут его использовать, если не заплатили. Кроме того, вам нужно ретранслировать их при подаче в суд или подобных угроз.

Ответ 22

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

Ответ 23

Проведите маршрут Антивируса, сделайте внешний вызов для "Обновлений". Если вы не получаете обновления, приложение перестает работать, если они не платят, перестаньте давать им обновления.

Я думаю, что это неправильное решение проблемы, но я понимаю, что ваша задача - делать то, что вам говорят.