![]()
Главная Обратная связь Дисциплины:
Архитектура (936) ![]()
|
Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля? 5 часть
<?php class BaseClass { public function test() { echo "Вызван метод BaseClass::test()\n"; }
final public function moreTesting() { echo "Вызван метод BaseClass::moreTesting()\n"; } }
class ChildClass extends BaseClass { public function moreTesting() { echo "Вызван метод ChildClass::moreTesting()\n"; } } // Выполнение заканчивается фатальной ошибкой: //Cannot override final method BaseClass::moreTesting() // (Метод BaseClass::moretesting() не может быть переопределён) ?> Классы, помеченные как final После объявления класса final он не может быть унаследован. Следующий пример вызовет ошибку: <?php final class FinalClass { }
class BogusClass extends FinalClass { } ?> 25.Технология PHP: «магические методы». Магические методы в ООП Чтобы сделать использование объектов проще, PHP имеет несколько магических методов. Это специальные методы, которые вызываются, когда над объектом производятся определённые действия. Таким образом разработчик может выполнить несколько общих задач относительно просто. Это методы, которые имеют особое значение, потому как их вызываете не вы, а PHP в определенные моменты. Чтобы не контролировать наступление этих моментов и не вызывать функции вручную вы можете добавлять к своим классам «магические» методы и быть уверенным в том что они будут вызваны автоматически. Все «магические» методы начинаются с двойного символа подчеркивания __ и являются методами объекта (не static), кроме двух: __callStatic и __set_state. Перечислим их все: void __construct(mixed $arg1[, mixed $arg2[, ...]]) Когда: Вызывается при создании экземпляра объекта. Имеет входное количество параметров таким каким его задаст пользователь, т.е. вы. void __destruct() Когда: в момент когда объект подвергается сборке мусора. Т.е. завершает своё существование. mixed __get(string $name) Когда: при попытке запросить свойство объекта, которого он не имеет (или недоступному из за private/protected модификатора). Именно имя этого несуществующего свойства он и передаст в качестве первого параметра. А что с этим делать – ваша забота. void __set (string $name, mixed $value) Когда: запустится, если вы попытаетесь несуществующему (или недоступному из-за private/protected модификатора) свойству присвоить какое-либо значение. В функцию будут переданы имя этого свойства и значение, которое ему пытались установить. mixed __call (string $name, array $args) Когда: вызовется, если у объекта была попытка выполнить несуществующий метод. Первым параметром будет имя этого метода, а вторым будет массив входных параметров, которые пытались этой функции передать. mixed __callStatic (string $name, array $args) Когда: аналогично __call, но работает с несуществующими статическими методами, т.е. методами которые были вызваны через синтаксис ИмяКласса::ИмяМетода, но не были найдены в классе. string __toString () Когда: вызывается, когда объект пытаются использовать как строку, например, в случае если вы хотите вывести объект через echo. Объект будет представлен как строка, так как вы захотите – он будет представлен тем, что будет возвращено этим методом, т.е. return обязателен. void __clone () Когда: после клонирования объекта оператором clone. Внутри этого метода вы можете использовать $this, чтобы изменить клон который создается. Зачем: Если в классе используются объекты, то обычное клонирование скопирует лишь ссылки на них, и новых экземпляр будет привязан к данным которые находятся не только внутри него, но и в том объекте из которого он клонировался. Выход - клонировать необходимое вручную внутри __clone bool __isset (string $name) Когда: сработает при проверке с помощью isset() несуществующих свойств у данного объекта. void __unset (string $name) Когда: вызовется, когда применяют функцию unset() на несуществующем свойстве класса. Принимает в качестве первого параметра имя этого свойства. object __set_state (array $properties) Когда: внутри вызова var_export(), первым параметром принимает свойства объекта которые собирается сохранить система. Если сделать eval полученного кода, вызовется эта функция mixed __invoke (mixed $arg1[, mixed $arg2[, ...]]) Когда: вызывается, когда объект используется в стиле функции. В метод __invoke передаются все параметры, которые вы передали, используя объект в качестве функции. Но они передадутся не в одном первом аргументе, а в обычном виде. Чтобы получить параметры в массиве можно, конечно же, воспользоваться функцией func_get_args() array __sleep () Когда: вызывается внутри функции serialize и определяет какие члены объекта надо сохранить, для этого вы должны вернуть массив содержащий строки-имена членов которые должны быть записаны. void __wakeup () Когда: вызывается когда метод "просыпается" десериализацией внутри unserialize 26.Объектно–ориентированная модель PHP: статические переменные, методы, интерфейсы. Класс - это базовое понятие в объектно-ориентированном программировании (ООП). Классы образуют синтаксическую базу ООП. Их можно рассматривать как своего рода "контейнеры" для логически связанных данных и функций (обычно называемых методами). Если сказать проще, то класс - это своеобразный тип данных. Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций (методов) для их обработки. Свойства и методы называются членами класса. Вообще, объектом является все то, что поддерживает инкапсуляцию. Если класс можно рассматривать как тип данных, то объект — как переменную (по аналогии). Скрипт может одновременно работать с несколькими объектами одного класса, как с несколькими переменными. Внутри объекта данные и код (члены класса) могут быть либо открыты, либо нет. Открытые данные и члены класса являются доступными для других частей программы, которые не являются частью объекта. А вот закрытые данные и члены класса доступны только внутри этого объекта. Статические члены класса Статические члены и статические методы могут использоваться для реализации того, что в ООП называется "методы класса" и "переменные класса". "Статическим методом класса" называют метод, который можно вызвать без создания объекта этого класса. "Переменной класса" называют переменную, к которой можно обратиться без создания объекта этого класса (и метод доступа при этом не потребуется). Статические методы не определяются через переменную $this, поскольку они не должны быть ограничены определенным объектом. Абстрактные методы Если метод определяется как abstract, он должен быть переопределен в классе-потомке. При этом параметры переопределенного метода должны совпадать с параметрами абстрактного метода. Модификатор уровня доступа для абстрактных методов не учитывается. Уровень доступа определяется методом, переопределяющим абстрактный. Интерфейсы Интерфейсы объектов позволяют программисту создавать код, который указывает, какие методы и свойства должен включать класс, без необходимости описывания их функционала. Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова "interface"; тела методов интерфейсов должны быть пустыми. Для включения интерфейса в класс программист должен использовать ключевое слово "implements" и описать функционал методов, перечисленных во включаемом интерфейсе. Если это требуется, классы могут включать более одного интерфейса путём их перечисления через пробел. Если класс включает какой-либо интерфейс и не описывает функционал всех методов этого интерфейса, выполнение кода с использованием такого класса завершится фатальной ошибкой, сообщающей, какие именно методы не были описаны. 27.Проблема безопасности веб-приложений «SQL-Injection» Обеспечение безопасности web-приложений – комплексная многоуровневая задача, имеющая множество аспектов, как общих для любых сетевых служб, так и характерных только для web-приложений. Первые включают безопасность сетевой инфраструктуры (маршрутизаторов, брандмауэров, DNS серверов и так далее), безопасность физических серверов, на которых расположены web-сервер и база данных, включая безопасность реализации стека протоколов TCP/IP и других работающих сервисов и так далее. Аспектами, специфическими для web-приложения, являются безопасность web-сервера и его конфигурации как сервиса и собственно безопасность скриптов, реализующих основную функциональность. Потенциальные угрозы: Нарушение функционирования приложения, или DoS (Denial of Service) атака Неавторизованное чтение данных из нашей базы Неавторизованная модификация данных в нашей базе Чтение файлов на сервере (Опасность п. 4 и 5 зависит от прав доступа пользователя) Модификация файлов на сервере или запуск посторонних процессов. Подавляющее большинство атак на web-приложения осуществляется специальным выбором передаваемых скрипту параметров. Основной способ защиты от этой угрозы заключается в тщательной проверке всех без исключения данных, получаемых от пользователя перед их использованием в программе. Одним из самых распространенных способов реализации угроз 1 и 2 является «SQL injection», то есть посылка скрипту данных, сформированных с целью выполнения скриптом SQL запроса, отличающегося от предусмотренного автором скрипта. Необходимые проверки пришедшей от пользователя информации в других случаях зависят от специфики использования этой информации. Часто встречающимся на практике случаем является работа с файловой системой в условиях, когда имена файлов задает пользователь. В этом случае для обеспечения приемлемого уровня безопасности требуется очень строгая проверка данных с помощью регулярных выражений. Самый простой и надежный способ состоит в том, чтобы заменить пользовательские имена файлов на сконструированные заведомо безопасные имена и хранить в базе данных таблицу соответствия этих имен. Другой способ состоит в жестком ограничении набора допустимых символов в задаваемых именах файлов (концепция «белых списков», то есть разрешено только то, что явно указано). Обычно же неопытные программисты используют концепцию «черных списков», то есть пытаются обнаружить известные потенциально опасные конструкции. Такой подход гораздо более громоздок и допускает большую вероятность появления уязвимостей ввиду того, что при работе с файловой системой с помощью системной функции open, Perl обеспечивает ее очень большую гибкость за счет разнообразия допустимых синтаксисов вызова. Еще одной часто встречающейся ситуацией является необходимость показывать пользователям информацию, введенную другими пользователями (например, форумы, гостевые книги и т. п.). Проблема состоит в том, что злонамеренный пользователь может ввести такую информацию (например, программу на языке JavaScript), которая негативно отразится на других пользователях нашего сайта. В качестве сравнительно безопасного примера приведем возможность немедленного закрытия только что открытой страницы. Для решения этой проблемы также пользуются концепциями подмены реальных тэгов их искусственными заменителями, белых списков и черных списков. Как и в предыдущем случае, черные списки являются самым трудоемким и самым ненадежным вариантом действий. Отдельно стоит упомянуть использование функций, напрямую вызывающих другие программы. К ним относятся system(), exec(), те же конвейеры и конструкцию ` `. Вызов таких функций с аргументами, задаваемыми пользователем крайне опасен даже после фильтрации, так как в дополнение к возможности вызова посторонних программ (см. предыдущий абзац) в рассмотрение должна приниматься специфика работы каждого вызываемого приложения, которая нам почти никогда не известна до конца. Другие потенциальные уязвимости включают вызовы вспомогательных скриптов, не предназначенных для непосредственной работы с пользователями, попытки чтения файлов, содержащих секретные данные нашего сервера и так далее. Защитой от таких действий является правильное распределение информации между скриптами и расположение скриптов на сервере. Следует создать директорию, недоступную из web (не являющуюся поддиректорией корня web-сервера или любой другой доступной снаружи деректории) и хранить все вспомогательные скрипты, модули, шаблоны параметры локальной конфигурации только в таких директориях. Одним важным принципом обеспечения безопасности является минимизация доступной для пользователей информации о внутренней архитектуре системы. Например, в сообщениях об ошибках при работе скрипта не следует сообщать пользователю текст SQL запроса, вызвавшего ошибку, так информация о структуре расположения данных в СУБД может облегчить злоумышленнику дальнейшее планирование атаки. 28.Методы реализации авторизации на web-сервере. Организация защищенных соединений, защита передаваемых данных. Примеры. Пример авторизации пользователей будет состоять из трёх файлов:
Файл index.php содержит форму, где пользователь вводит свое имя и пароль. Эта форма передаст данные файлу authorize.php, который в случае успешной авторизации допустит пользователя к файлу secretplace.php, а в противном случае выдаст сообщение об ошибке. Файл secretplace.php содержит сценарий, который предоставляет секретную информацию только зарегистрированным пользователям, а всех остальных пользователей перенаправляет на страницу для ввода имени и пароля. Идея решения состоит в реализации аутентификации на уровне канальных приемников, встраиваемых в инфраструктуру канала Remoting на стороне клиента и сервера. Аутентификационная информация передается в заголовках запроса (TransportHeaders), результаты аутентификации передаются в заголовках ответа сервера. Авторизация выполняется с помощью декларативной проверки соответствия роли пользователя. В случае успешной аутентификации на сервере приложения создается пользовательская сессия, в которой сохраняются пользовательские данные. Другая пользовательская сессия создается на Web-сервере, причем стандартный механизм сессий ASP.NET не используется, поэтому его можно отключить в web.config. Сессии на сервере приложения и Web-сервере различны по содержанию, так как сервер приложения может хранить обязательные для каждого пользователя объекты, вполне возможно unmanaged (COM). Взаимосвязь между клиентом, Web-сервером и сервером приложения осуществляется по идентификатору сессии. Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля? 1. Из-за невнимательности программиста, во всей системе могут быть дырки, воспользовавшись этими дырками, злоумышленник может вытащить хеш пароля из БД и подставить его в свои куки, тем самым получить доступ к закрытым данным. В нашем же случае, двойной хеш пароля нечем не сможет помочь хакеру, так как расшифровать он его не сможет(теоретически это возможно, но на это он потратит не один месяц, а может быть и год) а воспользоваться этим хешем ему негде, ведь у нас при авторизации свой уникальный хеш прикрепленный к IP пользователя. 2. Если злоумышленник вытащит трояном у пользователя уникальный хеш, воспользоваться им он также не сможет(разве если только, пользователь решил пренебречь своей безопасностью и выключил привязку к IP при авторизации).
29.Регистрация домена второго, третьего уровня (российские, зарубежные), географические домены третьего уровня, обслуживание DNS-записей. Основные термины Домен — область пространства иерархических имен сети Интернет, которая обозначается уникальным доменным именем, обслуживается набором серверов доменных имен (DNS) и администрируется его администратором. Администратор домена второго уровня — юридическое лицо, осуществляющее организационную и техническую поддержку функционирования домена. Аннулирование регистрации — исключение из реестра информации о домене и его Администраторе. Делегирование домена третьего уровня — размещение и хранение информации о доменном имени и соответствующих ему записях на корневых серверах DNS домена второго уровня, что обеспечивает функционирование домена в сети Интернет. Делегирование домена с записями, переданными из системы регистрации Передающего Регистратора, возможно только в течение срока регистрации домена. Делегирование домена со списком DNS-серверов, указанных Администратором, возможно только в течение срока действия регистрации домена. Домен RU является корнем для российской зоны Сети. И как из корня вырастают стволы и ветви, так и от корня RU начинается рост дерева имен российского Интернета. Начинается он за счет появления доменов второго уровня - второй части доменного имени, отделенного от первого точкой. И вот здесь начинаются различия. Принципиально любая организация, любой человек может подать заявку на регистрацию собственного домена второго уровня. Если заявителем будут выполнены определенные РосНИИРОС требования к регистранту, а название домена, выбранного им, еще не было никем зарегистрировано, то через небольшой период времени эта организация или человек становится собственником домена второго уровня, то есть владельцами собственного доменного имени. Если обратиться к нашему примеру, то этот домен будет выглядеть так: dog.ru Но есть ряд названий доменов второго уровня, (речь идет только о России, не более того), которые выделены из общей массы и изначально были определены как домены второго уровня для общего пользования. Это так называемые домены типа GEOGRAPHICAL, которые выделены для субъектов Российской Федерации - например, spb.ru, nsk.ru и другие. У этих доменов, как и у доменов первого уровня, нет фактического владельца, но есть организации, отвечающие за их функционирование и координирующие их развитие в своих регионах. Также есть несколько специализированных доменов типа GENERIC, сделанных по подобию отраслевых американских доменов. К ним относятся домены второго уровня AC.RU, COM.RU, EDU.RU, NET.RU, ORG.RU, INT.RU, MIL.RU, PP.RU, также являющихся доменами общего пользования. Домены общего пользования открыты для регистрации всем на общих основаниях, в соответствии с правилами регистрации, опубликованными администраторами доменов и на сервере администратора домена RU. Для того чтобы зарегистрировать имя внутри одного из таких доменов, нужно обратиться к его администратору. Что вы при этом регистрируете? Совершенно верно, домен третьего уровня. А можете назвать его и хостом, если это имя будет использоваться в качестве имени конечного узла. В зависимости от домена общего пользования, в котором будет регистрироваться новый домен, его полное наименование будет выглядеть примерно так: dog.org.ru, dog.nsk.ru и т.п. По регистрации в доменах типа GENERIC есть некоторые ограничения. Заключаются они в том, что администратором (владельцем) домена третьего уровня могут выступать: в зоне .NET.RU - организация, с целью реализации проектов, связанных с развитием сети Интернет; в зоне .ORG.RU - некоммерческая организация; в зоне .COM.RU - коммерческая организация; в зоне .PP.RU - физическое лицо. Владелец домена второго уровня (кстати, надо отметить, что право владения выдается организации или человеку только на год, на каждый следующий год заявку надо продлевать) имеет право самостоятельно решать, будет ли он регистрировать домены третьего уровня внутри своего домена или нет. Это решение объявляется при оформлении заявки на получение домена второго уровня. Понятно, что это относится ко всем доменам, за исключением доменов общего пользования. Домены, владельцы которых объявили о своем желании регистрировать домены третьего уровня, называются доменами открытого использования. Все вопросы по регистрации новых доменов решает его администратор. Он объявляет политику, общие правила, на основании которой будет принимать заявки, и эти правила могут очень существенно отличаться друг от друга. Кто является владельцем домена третьего уровня? В доменах общего пользования владельцем является то лицо, на кого будет зарегистрирован домен. А вот в остальных доменах этот вопрос решается по-разному, в зависимости от того, какие правила устанавливает администратор домена второго уровня. Узнать, кто же действительно имеет права на то или иное доменное имя, можно с помощью специальных программ - Whois (что можно примерно перевести как "Кто есть кто"), - либо можно воспользоваться специальным сервисом на сайте РосНИИРОС. Какие существуют ограничения на имена доменов? В документах международной организации ICANN таких ограничений немного. Среди них - требование на размер каждой части доменного имени - оно не может быть длиннее 63 символов. В имени не могут использоваться никакие иные символы, кроме букв английского алфавита обоих регистров, цифр и дефиса, который может использоваться только внутри имени (в связи с последними принятыми соглашениями эти ограничения расширены, но об этом в другой раз). Определенные ограничения могут накладываться администраторами национальных доменов - минимальная или максимальная длина имени, недопустимость регистрации имен, составленных из одних цифр и иные. Исходя из этих ограничений, можно сделать следующий вывод: нет никаких наименований, зарезервированных для использования в названиях доменов. Что из этого следует? То, что такие привычные всем имена, как 'www', 'ftp', 'mail' и иные могут использоваться как имена доменов второго, третьего и далее уровней и обозначать они будут только название соответствующего домена (хоста) и ничего более. Следовательно, доменные имена www.dog.ru, ftp.dog.ru равноценны по своему статусу доменному имени cat.dog.ru и являются доменными именами третьего уровня. А имя www.cat.dog.ru будет обозначать домен четвертого уровня. Доме́нное имя — символьное имя, служащее для идентификации областей — единиц административной автономии в сети Интернет — в составе вышестоящей по иерархии такой области. Каждая из таких областей называется доме́ном. Общее пространство имён Интернета функционирует благодаря DNS — системе доменных имён. Доменные имена дают возможность адресации интернет-узлов и расположенных на них сетевых ресурсов (веб-сайтов, серверов электронной почты, других служб) в удобной для человека форме. Полное доменное имя состоит из непосредственного имени домена и далее имён всех доменов, в которые он входит, разделённых точками. Доме́нная зона — совокупность доменных имён определённого уровня, входящих в конкретный домен. Например, зона wikipedia.org. включает все доменные имена третьего уровня в этом домене. Термин «доменная зона» в основном применяется в технической сфере, при настройке DNS-серверов (поддержание зоны, делегирование зоны, трансфер зоны). Регистрация (делегирование) домена (доменного имени): 1) Внесение имени и соответствующего ему IP-адреса в базу данных DNS-сервера. Регистрация в доменах верхнего уровня обычно платная. Регистрация доменов нижнего уровня обычно бесплатна и выполняется провайдером. 2) Закрепление определенного доменного имени за физическим или юридическим лицом, путем внесения соответствующей информации в регистрационную базу данных организации, координирующей распределение доменных имен.
30.Хостинг-площадки, виды хостинга, особенности, возможности и ограничения. Российский хостинг, зарубежный хостинг. Хо́стинг (англ. hosting) — услуга по предоставлению вычислительных мощностей для физического размещения информации на сервере, постоянно находящемся в сети (обычно Интернет). Хостингом также называется услуга по размещению оборудования клиента на территории провайдера с обеспечением подключения его к каналам связи с высокой пропускной способностью (колокация, от англ. colocation). Обычно под понятием услуги хостинга подразумевают как минимум услугу размещения файлов сайта на сервере, на котором запущено ПО, необходимое для обработки запросов к этим файлам (веб-сервер). Как правило, в услугу хостинга уже входит предоставление места для почтовой корреспонденции, баз данных, DNS, файлового хранилища и т. п., а также поддержка функционирования соответствующих сервисов. Хостинг баз данных, размещение файлов, хостинг электронной почты, услуги DNS могут предоставляться отдельно как самостоятельная услуга, либо входить в понятие услуги. Одним из важных критериев выбора хостинга является используемая операционная система, поскольку от этого зависит программное обеспечение, которое будет поддерживать функциональность тех или иных сервисов. Важным аспектом описания хостинга является наличие тех или иных служб и возможностей: · поддержка CGI: Perl, PHP, Python, ASP, Ruby, JSP · поддержка .htaccess/.htpasswd (для Apache) · поддержка баз данных · А также установленные модули и фреймворки для каждой из возможностей. · Хостинг как услугу сравнивают и описывают по количественным ограничениям: · размер дискового пространства · количество месячного трафика · количество сайтов, которые можно разместить в рамках одной учетной записи · количество FTP пользователей · количество E-Mail ящиков и объём места, предназначенного для почты · количество баз данных и количество места под базы данных · количество одновременных процессов на пользователя · количество ОЗУ, и максимальное время исполнения выделяемое каждому процессу пользователя · качественным ограничениям: · свободные ресурсы CPU, оперативной памяти, которые влияют на быстродействие сервера · пропускная способность каналов, которая влияет на загрузку информации. · удаленность оборудования хостера от целевой аудитории сайта, которая влияет на загрузку информации. Некоторые платные хостинговые компании предоставляют бесплатный тест на определённый период, по истечении которого пользователь должен определиться подходит ли для него выбранная хостинговая компания, и имеет ли смысл оплачивать большие периоды. Как правило такие тесты предоставляются только владельцам доменов второго уровня во избежание спекуляций с тестовыми аккаунтами. Помимо платных хостеров существуют также и бесплатные хостинг компании, поддерживающие большинство описанных веб-технологий. Однако в России они не распространены, поэтому люди пользуются в основном услугами платного хостинга. Виды хостинга По условиям предоставления хостинг часто разделяется на платный и бесплатный. Обычно компания, предоставляющая бесплатный хостинг, зарабатывает путем показа рекламы на страницах, размещенных на нем. Бесплатный хостинг, как правило, медленнее платного, предоставляет только базовые услуги и иногда ненадёжен (то есть может закрыться). Частные лица для своих домашних страничек на начальном этапе их развития используют бесплатный хостинг. Общественные организации могут использовать как платный хостинг, так и бесплатный. Коммерческие организации практически всегда пользуются услугами платного хостинга. Также можно разделить услуги хостинга по типу предоставляемого ресурса: виртуальный хостинг — предоставляется место на диске для размещения веб-сайтов, среда исполнения веб-сервисов единая для многих пользователей, ресурсы распределены между всеми пользователями на одном сервере, где может размещаться от 50 до 1000 пользователей. Небольшие дешевые хостинг-провайдеры часто пренебрегают безопасностью и вообще не разграничивают привилегий пользователей, что позволяет одному пользователю на сервере иметь доступ к сайтам сотен других пользователей. У более крупных и дорогих провайдеров эта проблема как правило решена. виртуальный частный/выделенный сервер (VPS или VDS) — предоставляется место на диске, часть общей памяти, процессорное время сервера. Выглядит для пользователя так же, как и выделенный сервер, но физически на одном реальном сервере располагается несколько виртуальных серверов. Услуга предназначена для проектов средней тяжести. В связи с тем, что четко разделить все ресурсы сервера невозможно (в частности I/O операции, ресурсы сетевой карты и др.), а многие провайдеры VPS продают ресурсов больше, чем есть на сервере, надеясь на то, что клиент задействует выделенный ему потенциал не полностью (оверселлинг), часто заявленная мощность VPS сервера не соответствует реальной. выделенный сервер — предоставляется сервер целиком. Используется для реализации нестандартных задач (сервисов), а также размещения «тяжёлых» веб-проектов, которые не могут сосуществовать на одном сервере с другими проектами и требуют под себя все ресурсы сервера. колокация (Collocation) — предоставление места в датацентре провайдера для оборудования клиента (обычно путем монтажа в стойке) и подключение его к Интернету.
![]() |