|
|
Отправлено myx Ср, 2008-05-21 18:49
|
Идея давно витала в воздухе, но за нее надо было взяться. Последней каплей стало совпадение во времени и пространстве двух факторов. Впрочем, надо сначала рассказать предысторию.
Для нас, представителей дешевой оффшорной рабочей силы, в банке существует система учета рабочего времени. Придя на работу, сотрудник должен зайти на соответствующую веб-страничку под своим логином/паролем и нажать на кнопочку "я пришел". В конце рабочего дня еще раз нажать на нее же: "я ушел". Разница во времени между этими двумя моментами заносится в базу данных, и впоследствии на основании этих данных банку выставляется счет за каждого из нас.
О том, что это надо делать, мне сообщили на втором месяце моего пребывания в Лондоне, но это так, мелочи :-) И к письму прилагалась просьба информировать обо всех случаях когда я забыл нажать кнопку, дабы наверху могли это поправить.
Так вот. Первым фактором послужило то, что мне сделали замечание, что я слишком часто забываю нажать на кнопочку, и что, мол, я один такой. Вот в это я, извините, не поверю никогда в жизни - мне слишком хорошо известна роль человеческого фактора в автоматизированных системах. Я скорее поверю в то, что я единственный, кто сообщает о том, что забыл нажать, и не ленится написать письмо об этом. А вторым фактором был приезд в Лондон barateli (aka dimachertov), который искренне и всей душой ненавидит эту систему и считает, что она глупа и порочна.
За обедом мы обсудили сложившуюся ситуацию и решили, что так дальше нельзя и с этим надо что-то делать. Надо написать скрипт, который будет отмечаться за нас. И нам хорошо - меньше забот, и начальству хорошо - меньше ошибок в отчетности. Даже странно, что до сих пор никто этого не сделал - в конторе полно программистов. Неужели задача настолько сложна?
(Оказалось, что задача и правда не из простых, но мы ее решили)
Оказалось, что задача и правда не из простых, тем более, что много сил тратить на ее решение не хотелось. Поэтому, чтобы не разбираться с внутрибанковской системой авторизации, решили обманывать систему на самом верхнем уровне - на клиентской стороне. Т.е. написать код на JavaScript, который будет за временем следить и кнопочки тыкать. В итоге ближе к вечеру, когда настал момент отмечать уход с работы, мы уселись разрабатывать принцип работы.
Камнем преткновения на нашем пути оказалась политика безопасности веб-браузеров, принятая не кем-нибудь, а самим консорциумом W3C. Можно слепить веб-страничку с фреймами и загрузить в один из фреймов страницу с кнопкой, только из JS-кода нельзя получить доступ к объектной модели документа, загруженного из постороннего домена. Соответственно, кнопочку не то, что нажать - даже увидеть не получится, если только не удастся воткнуть JS-ный код на сервер, где крутится база данных учета времени.
Ломать сервер ну очень не хотелось - это уже не мелкое хулиганство, за это и влететь может. Да и шансы на успех мизерны - все-таки банк, уж что-что, а система безопасности тут наверняка качественная, нам не по зубам. А вот на локальной машине можно творить практически все, что угодно, лишь бы постороннее ПО не ставили. Поэтому решили поискать лазейку в системе защиты браузера.
"В лоб" пробиться не удалось. Как мы ни пытались исхитриться, интерпретатор JavaScript четко отлавливал, что код из чужого домена, и к страничке-жертве нас не подпускал. Идея сменить браузер тоже не помогла - они все послушно следуют требованиям W3C.
Моя затея попробовать, используя XMLHttpRequest, своровать исходный код HTML-страницы с сервера и при помощи JS/DHTML воткнуть его в рабочую страницу также успеха не принесла. Система учета времени сама написана с использованием сложной фреймовой структуры, и собрать на клиентской стороне поддельную копию веб-страницы не удалось. Почему-то по отдельности фреймы просто не грузятся - видимо, создатели предусмотрели такой подход.
Отчаявшись решить проблему на чисто клиентском уровне, мы решили попытаться спуститься уровнем ниже и просто тупо посылать требуемое событие непосредственно на сервер, имитируя нажатие. Оказалось, что и тут не все просто. Помимо пресловутой авторизации, выяснилось, что вместе с данными форма посылает еще какой-то безумной длины хэш, непонятно по какому принципу сгенерированный. Когда и по какому принципу он меняется - тоже неизвестно. Выковырять его из формы, конечно, можно, но... очень уж получалась сложная и ненадежная система, к тому же неизвестно, какие еще подводные камни нам встретятся при реализации.
В общем, мы немножко приуныли. Не хотелось верить, что мы не сможем заставить компьютер отмечаться за нас, но задача казалась неподъемной. И тут barateli практически случайно наткнулся на забавную особенность Internet Explorer'а: если написать в адресной строке javascript:(произвольный JavaScrit-код), то этот код исполнится. Сам по себе этот факт, в общем, не новость, хотя я и забыл про него напрочь, но самое главное: оказалось, что код исполняется в контексте загруженного в данный момент окна! И, соответственно, если в браузер была загружена система учета времени, из этого кода ее можно потрошить, как угодно!
Ухватившись за идею, я начал развивать ее. Основной проблемой было то, что при нажатии на кнопку окно перегружается и скрипт, как его часть, прекращает существование. Это было решено посредством открытия нового окна, в котором, собственно, и крутилась "жертва", а в первом окне работал скрипт, управляющий вторым окном. Во-вторых, писать весь скрипт в одну строчку - вещь крайне неудобная, поэтому, поразмыслив немного, я изобрел маленький скрипт, втыкающий в код страницы буквально следующее: <script src="test.js"></script>, где test.js, собственно, и содержит весь "зловредный" код. И это сработало! Недаром в CQG моими любимыми багами были HTML-injections! :-)
Вот, собственно, и все. Дальнейшее - дело техники.
А мораль тут, кстати, довольно неожиданная. Мы с barateli на собственной шкуре ощутили эффективность "парного программирования" - методики из арсенала Extreme Programming. Никто из нас по отдельности не решил бы эту задачу: я без него уперся бы в какой-то один безнадежный подход, а он без меня не довел бы до логического завершения ни одну из своих идей. А в паре мы идеально дополняли друг друга: он беспрестанно генерировал идеи, а я либо сходу отфильтровывал совсем уж безумные, либо цеплялся за них и реализовывал. Он, в свою очередь, не давал мне закопаться в ненужные детали, не имеющие на данный момент практического значения.
Вот так мы и провели этот вечер: сидя за одним компом, с горящими глазами обсуждая возможность или невозможность того или иного подхода (порой чуть ли не на спор!), и в четыре руки переписывая код снова и снова, придавая ему все более и более причудливые формы. И в итоге родился подход, который пробил-таки брешь в системе защиты. Конечно, от прототипа, демонстрирующего техническую возможность нажать на кнопку из JS-скрипта, до работающей программы еще предстояло потрудиться, но главное было сделано.
В этот день я впервые за долгое время возвращался с работы довольный. А спустя еще пару вечеров я написал первую тестовую версию программы, которая отметила мой приход на работу ровно в 9:00, несмотря на то, что на самом деле я с утра был на встрече, проходившей в другом здании, и к компьютеру пришел только в без четверти 10.
P.S. Сегодня пришло в голову, что если, следуя маджентовской традиции, придумывать для проекта имя из греческой мифологии, то лучше, чем Prometheus, не найти :-) И не надо сарказма, я прекрасно помню, чем кончил Прометей!
Current Music:
Ozzy Osbourne - S.I.N.
Tags:
job, prank, technology











 |
 |
|
From:
_myx
|
Date: 05/23/2008 12:56:03 |
| |
|
1. Интересно, в чем же заключалось твое "втрое меньшее". Не побоишься написать об этом в открытом источнике? :-)
Мне искренне интересно, что в моем случае может послужить причиной увольнения. Может быть, я создал угрозу безопасности банка? Так я пользовался исключительно штатными средствами. Я еще понимаю, если бы я оставил Прометея крутиться, а сам забил на работу и вообще там не появлялся - так ведь я же на работе провожу времени даже больше, чем положено. Опаздываю максимум на пять минут, а задержаться могу и на полчаса, и на час.
Я уж не говорю о том, что я успешно сделал то, за что мне, собственно, и платят (причем, замечу, сделал это в свободное от работы время). Иными словами, лишний раз подтвердил свою профпригодность. Если меня за это уволят - значит, мне в этой конторе делать нечего.
2. Мой журнал - публичный, и все записи в нем открыты для чтения всем желающим. Пишу я не с работы - но не потому, что чего-то боюсь, а потому, что на работе я занимаюсь преимущественно работой и времени на это не остается. Обычно я пишу в общественном транспорте и публикую уже из дома.
Однако конкретно вот этот коммент я пишу с работы. Из дома не успел ответить: не поверишь - боялся опоздать :-) Потому что Прометей Прометеем, но на работу надо приходить вовремя.
3. Имя barateli упоминается с его согласия :-)
4. Письмо так и не дошло, попробуй еще раз.
|
 |
|

 |
 |
1,2,3. дай Бог чтобы ты оказался прав :) случаев секретных у меня нет, лень писать, ибо ничо особо интересного :) но я подумаю и чонить вспомню смешное, опишу.
4. Задачка на умение находить оптимальное решение по организации работы.
в офисе есть холодильник, в котором сотрудники хранят личные продукты.
регулярно обнаруживается, что какой-то продукт протух, и начал вонять, к
этому моменту провонять успевают все продукты. как сделать так, чтобы
несвежие продукты регулярно выбрасывались, но при этом не выбрасывались
свежие продукты. Фашистские (раз в неделю выбрасывать все) и армейские
(заставить всех строем вечером идти к холодильнику и проверять все продукты)
неприемлемы. Метод должен минимально напрягать (а в идеале вообще не
напрягать) сотрудников, чтобы не отвлекать их от их основной и единственной
задачи - хорошо выполнять свою работу. Народу в офисе много, более 30
человек, так что личное общение "а чья тут колбаса" - не выход.
сразу скажу что эта задачка нашумела в инете, но правильный ответ так и не был опубликован, так что если ты видел решение, знай, что есть лучше :)
|
 |
|




 |
 |
чувак, ты гений!!! :) я был прав, что верил именно в тебя!
именно из тех же трех предпосылок исходил и я при решении задачи :))
долго ломал голову над тем, чье решение - твое или мое, лучше, но так и не пришел к строгому выводу.
мое такое:
в понедельник рядом с холодильником кладется пачка наклеек цвета цвет0 (красный). Всем сотрудникам предлагается на свои продукты при закладке в холодильник лепить такую наклейку. Они могут и не лепить, это никак не влияет на результат. В следующий понедельник с утра уборщица при мытье холодильника на все продукты без наклеек лепит наклейки цвета цвет0 (красный). Убирает эти наклейки в шкаф, и выкладывает наклейки цвета цвет1 (зеленый). Все сотрудники, положившие в холодильник долгоиграющие продукты (1.5 кг картошки например), и помнящие о них, залепливают цвет0 цветом1 (зеленым). В следующий понедельник уборщица на все продукты без наклеек лепит наклейки цвета1 (зеленый), выбрасывает все продукты с наклейками цвета0 (красный), выкладывает на стол наклейки цвета2 (синий). Далее по циклу.
Длительность такта (1 неделя) можно менять произвольно.
Плюс в том, что продукт с наклейкой определенного цвета опознать проще, чем посчитать количество полосок на каждом продукте.
Минус в том, что лепить наклейки дольше чем чиркнуть полоску :)
Твой способ дешевле - 10 рублей в месяц против 40 рублей у меня :)
есть еще проблема открытого пакета молока - он портится за сутки. Но это решается ежедневной наклейкой на такие открытые пакеты прошлонедельной наклейки и выбрасыванием пакета на следующий день по этой яркой метке.
о! понял в чем минус твоего метода - у тебя решение "выбросить-не выбросить" принимает уборщица, т.е. включает интеллект, а это не есть хорошо :)
если сотрудник хочет хранить какой-то продукт 2 недели, и знает, что он не испортится, то он никак не может помешать уборщице (которой кажется что он портится за неделю) выкинуть его, ведь стереть метки маркера нельзя. общение с уборщицей не выход. я, например, так ни разу и не видел, кто убирается в моем кабинете, я тут уже год работаю.
|
 |
|


 |
 |
пакета молока под рукой нет, но соки точно хранятся не более суток с момента открытия. молоко по-моему тоже. секретаря занимать работой уборщицы когда в этом нет необходимости - нельзя. наклейки, которые не отклеиваются, существуют, размер 1*2 см, продаются на ленте, стоят копейки, мы такими помечали товары, когда я 9 лет назад работал в Радианте. ее даже специально оторвать нельзя.
идея с дополнительным пакетом не будет работать, так как когда сотрудник забудет про этот продукт, он будет тухнуть в холодильнике месяцами.
|
 |
|


 |
 |
зачем использовать офис-менеджера (который есть не во всех офисах), когда можно использовать уборщицу, которая в любом случае регулярно моет холодильник, т.е. выкладывает из него продукты?
про руководителя: именно правильный руководитель и понимает, что нельзя заставлять офис-менеджера выполнять работу, с которой справится уборщица. кстати говоря, мои друзья, работающие руководителями высшего звена, не смогли решить эту задачку. они даже не могут осознать проблему - ну протухают продукты, да и хер с ними. они даже на пол-шага к решению не подошли.
идея с пакетами не будет работать - что если человек хочет хранить 1.5 кг картошки 3 недели? а если 2 месяца? к тому же зачем использовать дорогостоящие и занимающие место пакеты, если можно их не использовать?
|
 |
|

 |
 |
|
From:
injir
|
Date: 05/30/2008 15:23:42 |
| |
|
Кого и для чего лучше использовать - сфера ответственности человека, принимающего решение в том пространстве, к которому относится холодильник. Если его, конечно, беспокоит то, что у него в лавке воняет :)
Так и не поняла про пакеты. Если моя картошка лежит в холодильнике и я не хочу/не могу забрать ее из конторы, то это мое право переложить ее в другую тару, чтобы ее никто не выбросил. Какова стоимость тары - моя проблема. Человек, оставляющий метки, наносит их на новую упаковку, не задаваясь вопросом, чье это и что внутри.
Если я забыла про продукт, не переложила в другую упаковку и поэтому его выбросили, это тоже моя проблема. Дежурный по холодильнику (кто угодно - хоть уборщица, хоть директор) не обязан отслеживать состав, количество и цвет продуктов. Он отвечает за их пометку и выбрасывание того, на чем стоит необходимое количество меток.
|
 |
|


 |
 |
|
From:
_myx
|
Date: 05/30/2008 16:02:43 |
| |
|
А твой способ - изящное дополнение к изложенному ниже механизму. Если на продукте зеленая наклейка - значит, к нему нужен особый подход. Какой именно - можно обговорить отдельно. Мне все-таки кажется, что человек, неявно заявивший, что его продукт "непортящийся" должен за это как-то отвечать. Например, на таре должна быть ссылка на хозяина, или еще какая особенность, дающая возможность в случае чего легко принять решение, что делать с "неприкосновенной" едой.
Кстати, я только что осознал, что на мне до сих пор лежит "печать CQG", где по умолчанию все продукты, не завернутые в пакет, считались общими - вот я и мыслю исходя из того, что у всех продуктов есть заменяемая тара :-)
|
 |
|

 |
 |
|
From:
_myx
|
Date: 05/30/2008 15:55:49 |
| |
|
В общем, резюмирую :-) Концепция следующая:
- с момента положения в холодильник продукт перестает быть индивидуальностью и становится рядовым объектом; каждый сотрудник может опознать только свой продукт, больше никто ничего ни о чем не знает;
- дежурный, ничего таким образом не зная о продуктах, руководствуется только метками на таре, которые сам же и обновляет;
- по достижении окончания "срока жизни", о чем свидетельствуют метки, объект уничтожается.
- сотрудник имеет возможность в любой момент заменить тару, если понимает, что "срок жизни" продукта истекает и это расходится с его интересами. Не успел - сам себе Буратино.
Такой подход вроде всех устраивает?
Понятие TTL
Представьте себе, что вам 5 лет и вы хотите кушать. Вы идете к папе и говорите: «Папа, я хочу кушать». Ваш папа смотрит телевизор, согласно таблице маршрутизации о посылает вас к маме. Вы идете к ней и просите «Мамааа, я хочу кушать». Мама болтает с подругой по телефону и согласно своей таблице маршрутизации посылает вас к папе. И так вы ходите как дурак от папы к маме и обратно, туда-сюда, туда-сюда, а все потому что криворукие админы (родители папы и мамы) неправильно настроили таблицу маршрутизации. Чтобы защититься от таких ситуаций придумали понятие TTL (Time To Live), что применительно к нашей ситуации означает количество терпения у мальчика, пока он не скажет «заебало» и не упадет перед ногами мамы или папы в беспомощном состоянии. Последний, по правилам (стандарты – это «так заведено в семье»), обязан послать короткий нелестный отзыв адрес того, кто послал мальчика кушать. Это так называемый icmp-пакет «мальчик издох».
(C) не мой :-)
|
 |
|

|
|