• От каких атак защищен процессор Эльбрус?

    OCTAGRAM
    @OCTAGRAM
    Там есть так называемый защищённый режим, унаследованный от советского Эльбруса. В СССР эта защита в железе дополняла защиту в софте. Несмотря на то, что Паскаль и Си ровесники (1970), пока стоял СССР, в страну Си не пускали, зато очень заинтересовались Адой, приняли ГОСТ, перевели книги, написали с десяток трансляторов, в том числе под Эльбрус. И там была гармония между семантикой языка программирования и железом.

    По прошествии лихих годин (выражение Ельцина, 1992 год) потенциал был растрачен, и былая гармония раскололась. Эльбрус выжил, но трансляторы для него теперь совсем другие, главным образом это Си (C++ там был куплен у Edison group, которые делают Comeau C++-> C транслятор). Си не создавался в расчёте на безопасность, это, по выражению создателей, переносимый ассемблер, но вот на этот ассемблер попытались навинтить унаследованную от советского Эльбруса аппаратную защиту. Если в случае с Адой железо органично продолжает воплощение языковых запретов, то для Си навинчивание защиты является хаком, и для многих программ на Си, особенно, где местечковое ООП реализовано, или хоть немного шаг влево, шаг вправо, всё, такая программа уже не транслируется без допиливаний. Так что если взять купить Эльбрус, там практически ничего не работает в защищённом режиме, он там где-то сбоку есть. В презентации МЦСТ про защищённый режим был описан программный комплекс из Эльбрус полностью в защищённом режиме и обычного ПК с Windows 10. В защищённом режиме не было графического режима, потому что даже примитивные библиотеки для фреймбуфера не портированы. Отображение было на Windows 10 по сети. Часть кода зачем-то пришлось портировать с C++ на C.

    Механизм защиты строится на том, что в дополнение к значащим битам информации есть биты тегов. В оперативной памяти они хранятся в битах ECC, вместо битов контроля ошибок аппаратных сбоев. Из памяти теги перетекают в регистры. Обращаться к памяти из защищённого режима можно только по дескриптору. Дескриптор должен иметь подходящий тег. Если тега нет, то это просто число, которым никак иначе нельзя воспользоваться. Любые неправильные операции над дескрипторами либо возбуждают исключение, либо ломают тег, превращая дескриптор в число.

    Дескриптор состоит из нескольких указателей и служебной информации. В служебную информацию входит дескриптор модуля. Можно ограничить, какой модуль может работать с конкретной структурой данных. То есть, какой-то другой модуль может получить указатель на чужую структуру данных, но она будет как чёрный ящик. Например, если в этой структуре лежат два числа, то чтобы прочитать эти числа, нужно из указателя на структуру данных получить валидный дескриптор на первое или второе число, а потом прочитать содержимое нового указателя. Система межмодульной защиты не даёт чужому модулю сделать такое преобразование. Значит, в обход нужного модуля ни читать, ни писать внутрь нельзя. Впрочем, операции с численным представлением дескриптора доступны. Например, если есть какой-то другой указатель, можно, сравнивая численные представления, узнать, находится ли содержимое по указателю внутри этой структуры или нет.

    Дескрипторы данных образуют двухуровневую модель. Для разных уровней два разных типа дескриптора. В общем случае какая-то (двухуровневая) структура данных — это массив из экземпляров классов. У массивного дескриптора есть текущий элемент, и есть границы массива. Текущий элемент по правилам языка Си может быть за границами. Для промежуточных вычислений нормально, а для разыменования — нет. Для массивного дескриптора работает адресная арифметика. Но размер элементов фиксирован.

    Каждый элемент массива в общем случае какой-то экземпляр класса, и описывается объектным дескриптором, в котором вместо границ массива другие указатели, нужные для реализации ООП. Конечно, полем объекта может быть массив, и получается такая вот матрёшка. Особую роль играет операционная система и рантайм библиотека. Процессор не такой уж умный, и отнюдь не любые правила преобразования дескрипторов зашиты в его железо. Многие операции на самом деле выполняются в рантайм библиотеке, которая наделена для этого дополнительными привилегиями. Она-то и знает про то, какие в модулях есть типы, и как, и кому можно преобразовывать дескрипторы.

    Также в Эльбрус есть способ пометить память как неинициализирванную для отлова ошибок обращения к ней.

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

    Подводя итоги, дескриптор содержит:
    1. обычный указатель
    2. тип дескриптора (массивный/объектный)
    3. дескриптор модуля
    4. индекс кадра стека
    5. либо указатели на границы массива, либо указатели на информацию для ООП

    1 и 5 дают как минимум 3 обычных указателя в одном дескрипторе, а 2-4 добивают дескриптор информацией под завязку. Известно, что размер дескриптора 128 бит. По всему видно, что как ни крути, а 3 64битных указателя, хоть их до 48 бит обрезай, ну не влезают никак. Может, 36 бит ещё можно впихнуть, но, похоже, что нет. Так что защищённый режим Эльбруса 32битный или не сильно отличается от такового.

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

    По большому счёту, многие ошибки, от которых даёт защиту Эльбрус, специфичны для C и C++. Программисты на С и С++ создают проблемы, и тут появляется Эльбрус и типа их героически решает. Ну это бред, если так подумать. По-хорошему, надо писать на Аде и от других требовать того же. Сколько лет существуют ошибки переполнения буфера, столько же лет существует и решение для них (Паскаль и Си ровесники). Учитывая, что в защищённом режиме Эльбрус почти ничего сишное просто так не работает, выходит, что под Эльбрус писать новый софт на Си, что на Аде, ощутимые вложения труда делать хоть как придётся. Но на Аде оно будет защищено везде, не только лишь на Эльбрусе, и на Аде есть 64 бита. А для повышенной защиты есть верифицируемое подмножество SPARK, которое в последнее время переживает бум. Раньше SPARK был довольно дубовый. Если что-то нельзя верифицировать, то в SPARK этого не было. Например, там не было обычных контейнеров, как в языке Ада, а были свои, занимащие сразу максимальный размер памяти. Но сейчас готовится заимствование из ParaSail и Rust безопасных указателей, так что с динамической памятью в SPARK станет посвободнее.

    Аппаратная защита в Эльбрусе не уникальна. Был когда-то Intel i960MX. На базе MIPS в Кембридже разработали CHERI, и он и сейчас продаётся. В отличие от Эльбруса, там не секретничают. Можно прямо с сайта скачать эмулятор, документацию и инструменты разработки. Бери, смотри, изучай кто хочешь. И это не Россия под санкциями, это влиятельный британский университет. Ничего из этого не помогло ему занять какие-то особо значимые ниши. Верификация не имеет 1:1 соответствия с аппаратным контролем, им бы лучше дополнять друг друга, чем заставлять выбирать, но видно, что реальные покупатели, авиация (Боинг), а с некоторых пор беспилотные автомобили (nVidia) полагаются на верификацию больше, чем на аппаратную защиту.
    Ответ написан
  • Возможности и преимущества использования Objective-C?

    OCTAGRAM
    @OCTAGRAM
    1. Вообще говоря, это для Эпл была трагедия. Не соглашусь с другими комментаторами насчёт того, что выбрать было нечего. Было, и не просто было, а Эпл плотно сидели на технологии SOM, которая была круче Objective-C. Так, нехрупкое ABI появилось в Objective-C лет на 15 позже, чем это было в SOM, и до сих пор в некотором отношении Objective-C уступает по хрупкости. Apple SOM был улучшенным ответвлением от IBM SOM и, например, вводил счётчик ссылок для всех объектов, чего не было в IBM SOM. При этом это был не замкнутый в себе язык программирования, а модель, доступная потенциально из любого языка программирования, и я насчитал 11 языков программирования, которые так или иначе поддерживались в SOM. Флагманским, надо понимать, считался диалект DirectToSOM C++, который в МакОСе реализовал транслятор Metrowerks CodeWarrior. Это гибрид C++, стоящий в одном ряду с C++/CLI, Objective-C++ и C++/CX, где в один язык трамбуют две иерархии. Собственно Эпл был главным двигателем OpenDoc, кроссплатформенного аналога ActiveX, где вместо COM — SOM. У Эпл был браузер CyberDog, поддерживающий OpenDoc аналогично поддержке ActiveX в Internet Explorer. Кроме OpenDoc, Эпл ещё делали Compound Document Framework, которая в перспективе должна была быть портирована на другие платформы, поддерживаемые SOM. То есть, SOM в экосистеме Эпл до Джобса занимал не последнее место, и многие разработки были завязаны на него, а какие-то из них даже опережали IBM, отвечавшего за порт SOM под другие платформы (Windows, OS/2, AIX). Кроме того, Эпл вкладывались в язык программирования Dylan, диалект Схемы, компилируемый в машинные коды, и имеющий паскалеподобный синтаксис вместо скобочных с-выражений (но с-выражения тоже допустимы). В общем, от недостатка вариантов Эпл отнюдь не страдал. Решающим, на мой взгляд, оказался провал Мак ОС 8 (Копланд) и предательство IBM. Если SOM занимала такое важное место в классической Мак ОС, то и в Копланд это должно было перейти, и, действительно, на тех образах, которые мне удалось найти, есть свидетельства того, что SOM туда тоже перекочевал. Если бы Копланд взлетел, у Эпл получилась бы современная ОС, 32-битная, с вытесняющей многозадачностью и проверенной объектной моделью. Почему Копланд не взлетел, отдельная тема. По слухам, начальство наломало дров, проект слишком часто переделывался, и когда нужно было выпускать следующую версию операционной системы, был слишком сырым (и пришлось выпустить Мак ОС 8.5 , продолжающую классическую линию). Вторая причина — предательство IBM. В 1996-1997х годах от Джавы многим снесло крышу, и IBM тоже. Они поставили все фишки на Джаву, а SOM оставили с закрытым кодом, а чтобы умники от опенсурса не рыпались, как в GNUStep, придавили гроб SOM патентами, которые кончились только в середине 2000х. Вот в таких условиях в Эпл приходит Джобс и привозит в своём обозе Objective-C и OPENSTEP OS. Там была какая-никакая библиотека виджетов, 32-битное ядро с вытесняющей многозадачностью. Из классической Мак ОС удалось перетащить AppleScript и Карбон, но SOM так и остался в истории.
    2. Низкоуровневая совместимость, особенно, после нехрупкого ABI Objective-C 2.0, но при этом трансляция в машинные коды. Благодаря этому приложения могут одновременно и пользоваться благами ООП, и не тащить мегабайты библиотек постоянно, и классы могут расширяться, не ломая совместимость с приложениями. COM, не поддерживая наследование, не смог занять такое же место, как Objective-C и SOM. Больше всех пытались в Mozilla, у них же XPCOM во все поля, но даже и у них вылезли «незамороженные интерфейсы», ломающие совместимость. Из-за этого, если установить, например, iTunes и iCloud на Windows, у них общие библиотеки, как и на Mac OS X, а Thunderbird и FireFox (а также приложения на базе XULRunner) каждый тащит свои мегабайты библиотек. Указанное свойство распространяется не только на Cocoa, но и на библиотеки третьих сторон. В других-то языках надо постоянно перекомпилировать под окружение, а оно возьми, да и не скомпилируйся с первого раза, а в Objective-C и SOM побросал всё вместе, и оно срослось. То, за что тут хвалят Java, получается доступным в языке, компилируемом в машинные коды. По моей практике библиотеки длинных чисел для I2P, машинные коды иной раз сильно заруливают.
    3. Кроме указанного в 2, лично мне нравится, что Эпл сказала «Нет» трассирующей сборке мусора и «Да» автоматическому счётчику ссылок. На фоне толпы сумасшедших, так и норовящих испоганить трассирующим сборщиком мусора всё, до чего только дойдут их грязные руки, а новые начинания безнадёжно испортить с самого начала, Эпл, будучи корпорацией, внезапно повела себя исключительно адекватно. Сказать трассирующей сборке мусора «Нет!», да ещё с такого высокого уровня! Это ли не чудо. При этом эта возможность адекватнее всего встроена в язык. В Делфи через COM-интерфейсы ARC был десять лет назад, Делфи получился самым удобным языком для COM, но эта возможность, как-то так получилось, так и осталась задвинутой на второй план. В языке Ада умные указатели можно было делать, и делали, но эта возможность так и не стала встроенной в язык, чтоб прямо на access можно было прагму или аспект навесить без заворачивания в Controlled. Objective-C стал первым, и ARC из него пошло в Делфи, правда, до Делфи для Виндоуз и Мак ОС Десять до сих всё никак не может докатиться. Вот не может, и всё тут, ну что ты будешь делать. Так тяжело додуматься, а если додуматься, так тяжело внедрить, ну так тяжело. Это к слову, почему ARC от Apple был как гром среди ясного неба. Вот нифига себе, у них есть мозги, и они умеют ими пользоваться, и руки у них тоже есть, и растут из правильного места. В то время, как другие мостили дорогу в ад или щёлкали клювом, эти взяли и сделали всё правильно.
    Ответ написан
  • Можно ли как-то предварительно загружать контент на сайте?

    OCTAGRAM
    @OCTAGRAM
    Есть link rel="preload", link rel="prefetch" для просто HTML.

    Также можно оформить web-страницу как HTML5 приложение и в манифесте перечислить используемые ресурсы. Они сохраняются в особом кеше, отдельном от HTTP, они подгружаются и обновляются другим механизмом. Но это сложнее, этот манифест потом нужно поддерживать в актуальном состоянии.
    Ответ написан
  • Как сделать защиту от повторной отправки формы по F5?

    OCTAGRAM
    @OCTAGRAM
    Кроме проверки на сервере, ещё можно возвращать в ответ на POST код перенаправления 303. Тогда браузер при навигации не повторяет POST.
    Ответ написан
  • Как грамотно обработать iOS CNA при подключении к WiFI с Captive Portal?

    OCTAGRAM
    @OCTAGRAM
    Следите за руками:

    21:23:25 GET "captive.apple.com" /hotspot-detect.html HTTP/1.0 302 0 - "CaptiveNetworkSupport-346 wispr" - - - "http://captive.apple.com/hotspot-1.html"
    21:23:25 GET "captive.apple.com" /hotspot-1.html HTTP/1.0 403 86 - "CaptiveNetworkSupport-346 wispr" - - - -
    21:23:26 GET "captive.apple.com" /hotspot-detect.html HTTP/1.1 200 467 - "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92" - - - -
    21:23:26 GET "captive.apple.com" /hotspot-detect.html HTTP/1.0 200 68 - "CaptiveNetworkSupport-346 wispr" - - - -
    21:23:28 GET "captive.apple.com" /hotspot-2.html HTTP/1.1 302 0 - "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1" - - - "http://мой-URL"


    Первые два ответа — это чтобы показать wispr такую бяку, чтоб он захотел вмешаться. wispr и на Mac OS X, и на iOS заканчивается на " wispr". Сразу 403 или 200 без Success как-то не очень работают, а 302 — вполне, но раз 302, то и по другому адресу надо что-то ответить. Потом запускается CNS (нет Safari), и ему отдаётся страничка, на которой есть Success и скрипт, который через полсекунды создаст обычную (без _blank) ссылку с абсолютным URL (который с двоечкой) и нажмёт по ней click()'ом. При отдаче страницы на stateful сервере помечается этот комп. Либо переход по ссылке, либо Success и код 200 на странице, либо просто это делается каждый раз после первого открытия, пока не разобрался, что-то из этого заставляет сделать ещё один запрос wispr, и на этот раз помеченному компу отдаётся самый обычный Success, а когда через полсекунды пойдёт переход по ссылке, CNS уже будет в состоянии «Готово» и направит переход в настоящий Safari, а сам закроется. При обнаружении открытия ссылки настоящим Safari пометка с компа сбрасывается.

    Бывает, зацикливается в CNA, но после увеличения задержки на секунду вроде нормализовалось.

    with AWS.Status;
    with AWS.Response;
    
    package Worker_Echoes.Apple.Captive is
    
       function Service (Request : AWS.Status.Data)
         return AWS.Response.Data;
    
    end Worker_Echoes.Apple.Captive;


    with Ada.Strings.Fixed;
    
    with AWS.URL;
    with AWS.Messages;
    
    with Worker_Echoes.Protected_Strings;
    with Worker_Echoes.Config;
    
    package body Worker_Echoes.Apple.Captive is
    
       use AWS;
       use all type AWS.Messages.Status_Code;
    
       Last_CNA_CNS_Peername : Protected_Strings.Protected_String;
    
       -------------
       -- Service --
       -------------
    
       function Service (Request : Status.Data) return Response.Data is
          URL_Object : constant URL.Object := Status.URI (Request);
          URL_String : constant String := URL.URL (URL_Object);
          User_Agent : constant String := Status.User_Agent (Request);
       begin
          if User_Agent'Length >= 6 and then User_Agent (User_Agent'Last - 5 .. User_Agent'Last) = " wispr" then
             if Last_CNA_CNS_Peername.Get = Status.Peername (Request) then
                return Response.Build
                  (Status_Code => S200,
                   Content_Type => "text/html; charset=utf-8",
                   Message_Body => "<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>");
             elsif URL_String = "http://captive.apple.com/hotspot-1.html" then
                return Response.Build
                  (Status_Code => S200,
                   Content_Type => "text/html; charset=utf-8",
                   Message_Body => "<HTML><HEAD></HEAD><BODY></BODY></HTML>");
             else
                return Response.URL ("http://captive.apple.com/hotspot-1.html");
             end if;
          elsif Ada.Strings.Fixed.Index (User_Agent, "Safari") = 0 then
             Last_CNA_CNS_Peername.Set (Status.Peername (Request));
    
             -- 1. Not sure if intact "<BODY>Success</BODY>" matters, but probably yes.
             -- 2. There was no delay previously, thus A had to be created before BODY is processed.
             --    Now it's possible to click A with id, but touching working code was avoided.
             return Response.Build
               (Status_Code => S200,
                Content_Type => "text/html; charset=utf-8",
                Message_Body => "<HTML><HEAD><SCRIPT>" &
                                   "window.setTimeout (function () {" &
                                      "var A = document.createElement (""a"");" &
                                      "A.setAttribute (""href"", ""http://captive.apple.com/hotspot-2.html"");" &
                                      "var Body = document.getElementsByTagName (""body"");" &
                                      "if (Body.length > 0) {" &
                                         "Body = Body [0];" &
                                      "} else {" &
                                         "Body = document.createElement (""body"");" &
                                         "document.getElementsByTagName (""html"") [0].appendChild (Body);" &
                                      "}" &
                                      "Body.appendChild (A);" &
                                      "A.click ();" &
                                   "}, 1000);" &
                                "</SCRIPT>" &
                                "<STYLE>body { display: none; }</STYLE>" &
                                "<TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>");
          else
             Protected_Strings.Reset (Last_CNA_CNS_Peername, Status.Peername (Request)); -- reset if matches
             return Response.URL (Config.Get_Target_URL);
          end if;
       end Service;
    
    end Worker_Echoes.Apple.Captive;
    Ответ написан
  • Как открыть safari из captiveportal popup?

    OCTAGRAM
    @OCTAGRAM
    Следите за руками:

    21:23:25 GET "captive.apple.com" /hotspot-detect.html HTTP/1.0 302 0 - "CaptiveNetworkSupport-346 wispr" - - - "http://captive.apple.com/hotspot-1.html"
    21:23:25 GET "captive.apple.com" /hotspot-1.html HTTP/1.0 403 86 - "CaptiveNetworkSupport-346 wispr" - - - -
    21:23:26 GET "captive.apple.com" /hotspot-detect.html HTTP/1.1 200 467 - "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Mobile/14C92" - - - -
    21:23:26 GET "captive.apple.com" /hotspot-detect.html HTTP/1.0 200 68 - "CaptiveNetworkSupport-346 wispr" - - - -
    21:23:28 GET "captive.apple.com" /hotspot-2.html HTTP/1.1 302 0 - "Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1" - - - "http://мой-URL"


    Первые два ответа — это чтобы показать wispr такую бяку, чтоб он захотел вмешаться. wispr и на Mac OS X, и на iOS заканчивается на " wispr". Сразу 403 или 200 без Success как-то не очень работают, а 302 — вполне, но раз 302, то и по другому адресу надо что-то ответить. Потом запускается CNS (нет Safari), и ему отдаётся страничка, на которой есть Success и скрипт, который через полсекунды создаст обычную (без _blank) ссылку с абсолютным URL (который с двоечкой) и нажмёт по ней click()'ом. При отдаче страницы на stateful сервере помечается этот комп. Либо переход по ссылке, либо Success и код 200 на странице, либо просто это делается каждый раз после первого открытия, пока не разобрался, что-то из этого заставляет сделать ещё один запрос wispr, и на этот раз помеченному компу отдаётся самый обычный Success, а когда через полсекунды пойдёт переход по ссылке, CNS уже будет в состоянии «Готово» и направит переход в настоящий Safari, а сам закроется. При обнаружении открытия ссылки настоящим Safari пометка с компа сбрасывается.

    Бывает, зацикливается в CNA, но после увеличения задержки на секунду вроде нормализовалось.

    with AWS.Status;
    with AWS.Response;
    
    package Worker_Echoes.Apple.Captive is
    
       function Service (Request : AWS.Status.Data)
         return AWS.Response.Data;
    
    end Worker_Echoes.Apple.Captive;


    with Ada.Strings.Fixed;
    
    with AWS.URL;
    with AWS.Messages;
    
    with Worker_Echoes.Protected_Strings;
    with Worker_Echoes.Config;
    
    package body Worker_Echoes.Apple.Captive is
    
       use AWS;
       use all type AWS.Messages.Status_Code;
    
       Last_CNA_CNS_Peername : Protected_Strings.Protected_String;
    
       -------------
       -- Service --
       -------------
    
       function Service (Request : Status.Data) return Response.Data is
          URL_Object : constant URL.Object := Status.URI (Request);
          URL_String : constant String := URL.URL (URL_Object);
          User_Agent : constant String := Status.User_Agent (Request);
       begin
          if User_Agent'Length >= 6 and then User_Agent (User_Agent'Last - 5 .. User_Agent'Last) = " wispr" then
             if Last_CNA_CNS_Peername.Get = Status.Peername (Request) then
                return Response.Build
                  (Status_Code => S200,
                   Content_Type => "text/html; charset=utf-8",
                   Message_Body => "<HTML><HEAD><TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>");
             elsif URL_String = "http://captive.apple.com/hotspot-1.html" then
                return Response.Build
                  (Status_Code => S200,
                   Content_Type => "text/html; charset=utf-8",
                   Message_Body => "<HTML><HEAD></HEAD><BODY></BODY></HTML>");
             else
                return Response.URL ("http://captive.apple.com/hotspot-1.html");
             end if;
          elsif Ada.Strings.Fixed.Index (User_Agent, "Safari") = 0 then
             Last_CNA_CNS_Peername.Set (Status.Peername (Request));
    
             -- 1. Not sure if intact "<BODY>Success</BODY>" matters, but probably yes.
             -- 2. There was no delay previously, thus A had to be created before BODY is processed.
             --    Now it's possible to click A with id, but touching working code was avoided.
             return Response.Build
               (Status_Code => S200,
                Content_Type => "text/html; charset=utf-8",
                Message_Body => "<HTML><HEAD><SCRIPT>" &
                                   "window.setTimeout (function () {" &
                                      "var A = document.createElement (""a"");" &
                                      "A.setAttribute (""href"", ""http://captive.apple.com/hotspot-2.html"");" &
                                      "var Body = document.getElementsByTagName (""body"");" &
                                      "if (Body.length > 0) {" &
                                         "Body = Body [0];" &
                                      "} else {" &
                                         "Body = document.createElement (""body"");" &
                                         "document.getElementsByTagName (""html"") [0].appendChild (Body);" &
                                      "}" &
                                      "Body.appendChild (A);" &
                                      "A.click ();" &
                                   "}, 1000);" &
                                "</SCRIPT>" &
                                "<STYLE>body { display: none; }</STYLE>" &
                                "<TITLE>Success</TITLE></HEAD><BODY>Success</BODY></HTML>");
          else
             Protected_Strings.Reset (Last_CNA_CNS_Peername, Status.Peername (Request)); -- reset if matches
             return Response.URL (Config.Get_Target_URL);
          end if;
       end Service;
    
    end Worker_Echoes.Apple.Captive;
    Ответ написан
  • Open Source — это только ПО?

    OCTAGRAM
    @OCTAGRAM
    Open Design, если речь о том, как физически изготовить изделие. Open Hardware, если речь об интегральных схемах
    Ответ написан
  • [VPN] Как обезопасить себя от просвета реального IP?

    OCTAGRAM
    @OCTAGRAM
    Надёжнее всего использовать дополнительную машину, в том числе виртуальную.

    Можно либо на виртуалке трафик создавать, пропуская через Windows, либо, наоборот, трафик Windows пропускать только через виртуалку.

    Чтобы трафик Windows шёл только виртуалку, при том, что физически доступ в Интернет имеет в первую очередь именно Windows, надо в настройках физического подключения к Интернет снять галочки с IPv4 и IPv6. Потом к этому подключению одним концом цепляется виртуальная машина, а другим концом эта же виртуальная машина цепляется к Host only сетевому интерфейсу, и именно через этот Host only интерфейс должна работать основная тачка.

    3G в схеме подключения усложняет задачу. 3G может не получиться подключить к виртуальной машине. На виртуалках есть форвардинг USB, но на случай, если не получится, я бы раскошелился на 3G роутер, подключаемый по Ethernet.
    Ответ написан
  • Бывает ли поисковый сервер по всем возможным пиринговым сетям?

    OCTAGRAM
    @OCTAGRAM
    Я у себя в поиске для p2p сделал ссылки на файловые поисковики:

    dc.proisk.ru/?q=test
    dc-poisk.no-ip.org/cgi-bin/TestCGI?Query=test&MatchMode=0&Type=0&Sort=0&SizeType=0&Size1=&Size2=&IndexS=0
    www.filestube.com/search.html?q=test&select=All
    proisk.ru/?q=test
    www.filesearch.ru/cgi-bin/s?q=test

    Из тех, что насобирал. Всякие BitPedia не добавлял, потому что там информация появляется не сама, а через весьма неудобный BitCollider
    Ответ написан
  • wiki & collaboration tools

    OCTAGRAM
    @OCTAGRAM
    X-Wiki, хотя, возможно, не по всем пунктам подходит
    Ответ написан
  • Как сделать Facebook like button на моем сайте?

    OCTAGRAM
    @OCTAGRAM
    Я подобные вещи видел только в виде собственных приложений, которые запрашивают все требуемые разрешения, а потом сами от имени пользователя делают всё, что требуется. Так, по крайней мере, у Dropbox на время проведения акции
    Ответ написан
  • Инструмент для написания и сопровождения актуальной документации Open Source проекта?

    OCTAGRAM
    @OCTAGRAM
    Я в своё время обратил внимание на lp4all: пишем wiki–страницы в отдельных файлах, пишем wiki–вставки в исходных файлах. И из того, и из другого делаются html страницы, исходные файлы раскрашиваются, wiki–вставки в них форматируются, документацию и исходники можно перекрёстно сослать друг на друга. Ведь иногда проще посмотреть, как это реально сделано, особенно, если документация не часто актуализируется
    Ответ написан
  • Twitter: Трек твита / Контент за твит?

    OCTAGRAM
    @OCTAGRAM
    У Dropbox, насколько я помню, сначала проводится авторизация собствееного приложения в Twitter, потом это приложение, пользуясь полученными правами, постит твит
    Ответ написан
  • Ликбез: ssh-agent x-session manager — зачем оно надо?

    OCTAGRAM
    @OCTAGRAM
    Собственно ssh-agent — аналог Pageant из комплекта PuTTY. Использование: генерим на своей машине пару закрытый-открытый ключ, закрытый ключ защищаем паролем при создании. Открытый ключ дописываем в .ssh/authorized_keys на удалённых машинах.

    Пробуем логиниться на удалённые машины и наблюдаем, что если раньше надо было ввести password от удалённого юзера, то сейчас надо ввести passphrase от локального закрытого ключа. Когда это надоест, можно воспользоваться Pageant или ssh-agent: запускаем его, просим расшифровать закрытый ключ в память, вводим passphrase, и с тех пор при заходе на удалённые машины passphrase уже не требуется. ssh-agent держит расшифрованный закрытый ключ в памяти и позволяет сторонним процессам использовать его, но не позволяет читать сам ключ.

    Если у ssh-agent указана команда (x-session-manager в нашем случае), эта команда запускается подпроцессом ssh-agent'а, и ssh-agent завершится вместе с этим дочерним процессом. Похоже, ssh-agent навешивают на иксовые сессии именно таким образом.

    P. S. X11 Forwarding — это другая фича ssh. X11 клиенты авторизуются посредством волшебного кукиса (.Xauthority), к которому обычно имеют доступ только локальные процессы, запущенные тем же юзером. Чтобы кукис не утекал на лево, как мера безопасности, ssh на удалённой машине использует другой кукис и после проверки подменяет его в протоколе на локальный кукис.
    Ответ написан
  • Виртуальная машина со статичным образом жесткого диска

    OCTAGRAM
    @OCTAGRAM
    По крайней мере, у VMWare Server есть такая штатная фича. VMWare Server бесплатен и вроде бы есть не менее бесплатный VMWare ESXi
    Ответ написан
  • Какой wifi-роутер лучший на самом деле, без маркетинговой требухи?

    OCTAGRAM
    @OCTAGRAM
    Если карман позволяет, можно заказать ALIX PC. Минималистичный x86 компьютер без возможности подключения монитора, например, но как роутер, NAS и медиасервер — сойдёт.

    Комплектация регулируемая, модуль WiFi отдельно, SATA отдельно, 3G отдельно — всей этой конфигурацией можно порулить и сделать сильно дороже или сильно дешевле. Можно что–то докупить в будущем.

    Большинство специализированных дистрибутивов Linux требуют «just an x86 PC», а именно ClearOS для сервера предприятия, ByzantRouter для WiFi mesh net, Amahi для домашнего медиасервера, и только у Mikrotik Router OS есть версия для ARM, но это скорее исключение, чем правило.
    Ответ написан
  • Какой аккаунт завести ребёнку?

    OCTAGRAM
    @OCTAGRAM
    Насколько я понял, планшет и без Гугл–аккаунта может работать
    Ответ написан