пятница, 15 апреля 2011 г.

Простая схема защиты от "кидалова" со стороны заказчика/клиента (ActionScript)

Преамбула:
Буквально на днях закончил один прожект который делался конечному клиенту через посредника веб-студию. Т.к. с моим непосредственным заказчиком (веб-студией) я имел первый опыт (мозготрах) работы, то зародились сомнения, а не кинут ли (тьфу х3, пока такого ни разу не случалось).
В общем решил хоть как то предохранится от возможного конфуза.

Проблема:
По быстрому/простому включить в проект блокировку, в случае если клиент не расплатится за заказ в оговоренный с ним срок или прихватизирует проект на финальном этапе разработки.

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

Итого:
1. ресурс - gif-файл 1х1 пиксель (35 байт);
2. хостинг - публичная папка Dropbox-а (если решите воспользоватся этим сервисом, могу прислать инвайт на регпочту, обоим к положенным 2 гигам по 250 метров накинут);
3. выбрана схема блокировки по наличию ресурса, а не по его отсутствию (т.к. флешку могут просматривать локально, внутри ethernet, проблемы с хостингом и т.п.).

Реализация:
public class TrustChecker
{
   private var _stage:Stage;
   
   public function TrustChecker(stage:Stage) 
   {
      _stage = stage;
      
      var loader:Loader = new Loader();
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
      loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onError);
      loader.load(new URLRequest("http://myurl.com/trust.gif?" + (new Date().getTime())));
   }
   
   private function onError(e:Event):void 
   {
      var target:LoaderInfo = e.target as LoaderInfo;
      target.removeEventListener(Event.COMPLETE, onComplete);
      target.removeEventListener(IOErrorEvent.IO_ERROR, onError);
   }
   
   private function onComplete(e:Event):void 
   {
      var target:LoaderInfo = e.target as LoaderInfo;
      target.removeEventListener(Event.COMPLETE, onComplete);
      target.removeEventListener(IOErrorEvent.IO_ERROR, onError);
      
      // вот тут то можно дать волю своей фантазии для донесения мысли заказчику
      var shape:Shape = new Shape();
      shape.graphics.beginFill(0x000000);
      shape.graphics.drawRect(0, 0, _stage.stageWidth, _stage.stageHeight);
      shape.graphics.endFill();
      _stage.addChild(shape);
   }
   
}

Защита достаточно тривиальна и прошаренный заказчик её в 5 сек обойдет, отредактировав байт код или декомпилировав флеху (от этого может в какой то степени спасти укус хорошего обфускатора secureSWF).

Комментариев нет:

Отправить комментарий