В настоящем пособии рассматривается порядок учета банковских и кассовых операций, расчетов с подотчетными лицами в программе «1С:Бухгалтерия 8» и описываются «секреты», позволяющие вести учет таких операций правильно, профессионально и эффективно.
Иллюстративный материал основан на редакции 1.6 типовой конфигурации «Бухгалтерия предприятия».
Первая глава посвящена вопросам отражения в «1С:Бухгалтерии 8» операций с безналичными денежными средствами.
Вторая глава – учету в «1С:Бухгалтерии 8» кассовых операций.
Третья глава освещает учет в «1С:Бухгалтерии 8» расчетов с подотчетными лицами.
В четвертой главе на примерах раскрываются «секреты» отражения в «1С:Бухгалтерии 8» отдельных операций с денежными средствами.
Пособие ориентировано на бухгалтеров-пользователей программы «1С:Бухгалтерия 8», студентов и преподавателей, слушателей учебных курсов центров сертификационного обучения фирмы «1С», изучающих информационные технологии бухгалтерского и налогового учета в типовых решениях на платформе «1С:Предприятие 8», а также специалистов по внедрению программы «1С:Бухгалтерия».
Пособие рекомендовано УМО по образованию в области финансов, учета и мировой экономики в качестве учебного пособия для студентов, обучающихся по специальностям «Финансы и кредит», «Бухгалтерский учет, анализ и аудит», «Мировая экономика», «Налоги и налогообложение». Предназначено также для магистрантов и слушателей ИПК по изучению дисциплин «Информационные системы в экономике, «Бухгалтерские информационные системы», «Проектирование бухгалтерских информационных систем».
Рекомендуется как один из материалов для подготовки к экзаменам 1С:Профессионал и 1С:Специалист-консультант по внедрению «1С:Бухгалтерии 8».
Книга также будет полезна пользователям "1С:Управление производственным предприятием 8" и "1С:Комплексная автоматизация 8" для изучения схем учета, реализованных в этих программных продуктах.
Авторы: аудитор, д.э.н., проф. Финансовой Академии при Правительстве РФ, Сергей Александрович Харитонов и д.э.н., проф. Финансовой академии при Правительстве РФ, Дмитрий Владимирович Чистов.
Книга предназначена для программистов, желающих быстро освоить основные принципы разработки программных комплексов в среде 1C:Предприятие 7.7.
Первая часть книги содержит теоретический материал для освоения платформы 1C:Предприятие 7.7. Во второй части книги на простых примерах демонстрируются приемы разработки и решения практических задач.
Книга будет полезна как программистам, так и администраторам и IT-специалистам.
Предлагаемая книга является переводом третьей части оригинального издания `Advanced Java 2 Platform How to Program`. Оригинал содержит более 1800 страниц, поэтому было принято решение русское издание разбить на три части. Первая часть посвящена созданию графического пользовательского интерфейса, двухмерной и трехмерной графике, компонентам JavaBeans, взаимодействию с базами данных. Вторая часть посвящена созданию распределенных приложений, а третья часть, которую вы держите в руках, посвящена созданию серверных приложений и корпоративных систем.
Предлагаемая книга является переводом второй части издания `Advanced Java 2 Plat-form. How to Program`. Оригинал содержит более 1800 страниц, поэтому было принято решение русское издание разбить на три части. Первая часть, книги посвящена созданию графического пользовательского интерфейса, двухмерной и трехмерной графике, компо-нентам Java Beans, взаимодействию с базами данных, вопросам обеспечения безопасно-сти.
Вторая часть книги, которую Вы держите в руках, посвящена распределенным при-ложениям и на примерах знакомит с технологиями построения распределенных систем, а также систем управления сетями: Remote Method Invocation (RMI), Jini, JavaSpaces, Java Management Extensions (JMX), Jiro и построению гетерогенных систем на основе Common Object Request Broker Architecture (CORBA). Рассматриваются различные подходы к по-строению пиринговых приложений на основе RMI, Jini, JXTA.
В книге рассматриваются все вопросы создания новых компонентов в системе программирования Borland Delphi. Книга состоит из трех частей. Первая посвящена реализации объектно-ориентированной модели, являющейся основой любого вновь создаваемого компонента. Во второй части подробно рассматриваются все детали процесса создания компонентов, в том числе выбор родительского класса, создание модуля компонента и включение его в существующий или новый пакет, создание свойств, методов и событий, тестирование и отладка компонента и его регистрация в среде Delphi. Рассматриваются также особенности создания компонентов для работы с базами данных, проблемы разработки нестандартных редакторов свойств и компонентов, разработка контекстной справки и ее подключение к справочной службе Delphi. Описываются особенности создания компонентов в новейшей на сегодня версии Delphi 8.0, а также отличия других версий, которые необходимо учитывать при разработке компонентов. В заключительной части приводятся исходные тексты многочисленных примеров компонентов. Книга рассчитана в основном на подготовленного читателя (программиста, имеющего опыт работы с Delphi), но может быть полезна начинающим программистам, студентам и преподавателям.
Описание: В книге автор попытался совместить две цели. Первая - последовательно рассказывая об основах расчетов, интерфейсе пользователя и переходя от простого к сложному, дать возможность читателю самостоятельно освоить Mathcad. Таким образом, книга может использоваться как самоучитель, позволяющий "с нуля" освоить ключевые возможности этой вычислительной системы. Вторая цель - изложить материал, делая акцент на решении конкретных математических проблем. Поэтому, приступая к той или иной задаче, открывайте соответствующую главу книги и используйте ее как справочник. Изложение материала начинается с краткого определения математических понятий и терминов, при этом предполагается, что читатель имеет базовые математические знания.
Для начинающих пользователей, студентов, программистов и научных работников.
Учебник по программированию на С/С++, написан специально для начинающих. Показан путь от самых азов языка до построения программ, использующих структуры, указатели и дисковые операции ввода-вывода, В последней главе у читателей создается полезное приложение, управляющее базой данных по домашней коллекции компакт-дисков. Даны многочисленные рисунки, примеры и упражнения.
Учебник основывается на версиях языка C, известных как стандарты K&R и ANSI C. В книге рассматриваются основные аспекты языка C++. Книга поможет в кротчайшие сроки изучить все азы языка, включая создание написание программ, использующих структуры, указатели, дисковые операции ввода и вывода и многое другое. Материал, предлагаемый в книге "Моя первая программа на С/С++ ", сопровождается многочисленными иллюстрациями, примерами подходов к решению задач и упражнениями. Она станет хорошим помощником для программистов, которые хотят изучить C и C++ после других языков наподобие Basic, Pascal, которые применяются в пакетах WordPerfect, Lotus или Excel.
Книга состоит из 13 основных глав:
Основы программирования;
Введение в C/C++;
Переменные и константы;
Вывод в C/C++;
Ввод в C/C++;
Операторы;
Для чего нужны функции;
Позвольте компьютеру принимать решения;
Циклы;
Массивы и строки;
Структуры и указатели;
Вывод на диск и принтер;
Как собрать все вместе.
Каждая глава кончается вопросами для закрепления пройденного материала и заданиями для самостоятельной работы. Учебник может использоваться как в качестве самоучителя, так и в школах и ВУЗах.
Язык гипертекстовой разметки HTML (HyperText Markup Language) был предложен Тимом Бернерсом-Ли в 1989 году в качестве одного из компонентов технологии разработки распределенной гипертекстовой системы World Wide Web.
Когда Т. Бернерс-Ли предложил свою систему, в мире информационных технологий наблюдался повышенный интерес к новому и модному в то время направлению-гипертекстовым системам. Сама идея, но не термин, была введена В. Бушем в 1945 году в предложениях по созданию электромеханической информационной системы Меmех. Несмотря на то, что Буш был советником по науке президента Рузвельта, идея не была реализована. В 1965 году Т. Нельсон ввел в обращение сам термин "гипертекст", развил и даже реализовал некоторые идеи, связанные с работой с "нелинейными" текстами. В 1968 году изобретатель манипулятора "мышь" Д.Енжильбард продемонстрировал работу с системой, имеющей типичный гипертекстовый интерфейс, и, что интересно, проведена эта демонстрация была с использованием системы телекоммуникаций. Однако внятно описать свою систему он не смог. В 1975 году идея гипертекста нашла воплощение в информационной системе внутреннего распорядка атомного авианосца "Карл Винстон". Работы в этом направлении продолжались, и время от времени появлялись реализации типа НуреrСаrd фирмы Аррlе или НуреrNоdе фирмы Хеrох. В 1987 была проведена первая специализированная конференция Нуреrtехt'87, материалам которой был посвящен специальный выпуск журнала "Соmmunication АСМ".
Поскольку качество видео на DVD носителях превосходное, то вопрос защиты от копирования стоит острее, чем защита от копирования фильмов на VCD и видеокассета. Может показаться, что вообще невозможно предотвратить незаконное копирование как цифровых так и аналоговых форматов и в любом случае найдутся "умельцы". Но все же принимаются меры. Какие мы вам расскажем далее.
Механизм защиты от копирования DVD
Во-первых, давайте посмотрим сколько дорожек доступно для копирования в DVD системе. Первая дорожка содержит необрабатываемые цифровые данные, считываемые с DVD привода, в возможные пиратские приборы встроены DVD видео декодеры, которые не будут принимать меры против защиты от копирования на дорожках 2 и 3. Система content scramble system (CSS) не позволяет добраться до содержания 2 и 3 дорожки без чтения первой. Сигнал со второй дорожки идет в аналоговом телевизионном формате NTSC или PAL. Поскольку VHS видеомагнитофоны очень распространены на сегодняшний день, то проще всего сделать копию в этом формате с DVD качеством.
content scramble system (система защиты от копирования)
основной целью CSS является защита содержания DVD от пиратского взлома и копирования через защиту от DVD видео декодеров и дисководов перезаписываемых дисков. Чтобы воспроизвести защищенный авторским правом материал с DVD ROM диска нужно согласие владельца авторского права, для чего и создана система content scramble. Три кода нанесены один за другим, что значит, что второй ключ может быть получен только при обладании первым, а третий только через получение второго. После этого, сжатое содержание может быть развернуто посредством третьего ключа. То есть для полного доступа нужно иметь три ключа. Конечно, алгоритм расшифровки можно получить через подписание документов, разрешающих тиражирование. Для предотвращения копирования с/на цифровые носители в среде персонального компьютера, предпринята попытка идентификации и шифровки данных. В среде персонального компьютера, для копирования необходимо два "компонента": DVD ROM привод и карта декодера, подсоединенные к PC шине. Поскольку данные с PC шины легко скопировать, то DVD ROM должен сам проверять законность получателя перед отправки данных. Также, для предотвращения воспроизведения нелегально скопированного материала, карта декодера должна проверять законность отправителя данных. Поэтому необходима обоюдная идентификация. А для предотвращения подмены диска после идентификации, DVD ROM привод должен периодически менять ключ шифра перед отсылкой.
Macrovision & CGMS/A (copy generation management system/analog (макровижн и система управления тиражированием/аналоговая))
Макровижн основан на различиях в работе видеомагнитофонов и телевизоров. Защита от копирования в этом случае состоит из двух элементов: AGC [Automatic Gain Control] автоматическая регулировка усиления и "полосатого" кода. Система AGC в телевизоре спроектирована так, что медленно реагирует на изменения, та же, схема, которая встроена в видеомагнитофоны, должна мгновенно реагировать на изменения. Именно это различие и лежит в основе системы. Суть в том, что макровижн изменяет сигнал так, что при воспроизведении картинка будет хорошей, а при записи на копии будут множественные качественные изменения. Что касается "полосатого" кода, то при воспроизведении он не оказывает никакого влияния на качество изображения, при просмотре копии на картинке появится ужасная вертикальная полосность.
В то время как макровижн направлен на устранение пиратских копий, CGMS/A направлена на контроль записи легальных копий. Информация CGMS/A вложена в выходящий видео сигнал. Для работы CGMS/A ( то есть для возможности сделать легальную копию) необходимо, чтобы записывающее оборудование распознавало CGMS. CGMS кодирует информацию на линии 21 системы NTSC, при этом CGMS имеет приоритет над антикопировальными сигналами макровижн, записываемых на ту же линию.
CGMS/D (система управления тиражированием/цифровая)
Эта система основана на стандарте IEEE 1394 и предназначена для ограничения ("copy once"- одна копия) и запрещение ("copy never"- запрещение копирования) создания цифровых копий. Цифровые приборы, такие, например как DVD плеер и цифровой TV, будут обмениваться ключами и идентификационными подтверждениями перед установлением канала. DVD плеер шифрует видео сигнал при отправке, а получающий прибор расшифровывает его. Пишущие цифровые приборы не смогут получать сигнал при внутренней маркировке "copy never", а при маркировке "copy once"- сделают копию и изменят маркер на "copy never". CGMS/D спроектирован для следующего поколения цифровых ТВ и видео рекордеров. Для этой системы нужны DVD проигрыватели нового поколения с цифровыми соединениями.
Код региона (код места)
Смысл этого кодирования состоит в том, что киностудии пожелали ввести дополнительную кодировку поскольку в большинстве случаев фильмы вышедшие на DVD в одной стране еще идут на киноэкране другой страны. Для увеличения доходов от проката фильмов для разных географических регионов устанавливаются разные коды. Этот код будет встраиваться в DVD проигрыватель на основании региона в котором он был продан. Это означает, что диски купленные в одной стране могут не проигрываться в другой.
Регионы разбиты так. Каждый диск будет идентифицироваться по цифре. Если диск разрешен к проигрыванию в более чем одном регионе, то соответственно и цифр будет больше.
1: Канада, США, Территории США.
2: Япония, Европа, Южная Африка, Средний Восток (включая Египет)
3: Южно-восточная Азия, Восточная Азия (включая Гонконг)
4: Австралия, Новая Зеландия, Центральная Америка, Мексика, Южная Америка, Карибы.
5: Бывший Советский Союз, Индия и Африка, Северная Корея, Монголия
6: Китай
Вторая часть серии статей "Использование регулярных выражений в PHP" посвящена решению ряда проблем обработки сложных текстов с помощью "продвинутых" операторов регулярных выражений.
Несмотря на то, что термины данные и информация используются взаимозаменяемо, между ними есть существенная разница. Данные существуют реально. Данные — - это список температур, перечень недавних продаж или опись товара, имеющегося в наличии. Информация — это прогнозы. Информация — это предсказание погоды, прогноз прибылей и убытков и тенденции сбыта. Данные записываются в виде нулей и единиц, в то время как информация обрабатывается мозгом.
Между данными и информацией располагается приложение: механизм, который преобразует одно в другое и наоборот. Например, при покупке книги в Интернете это приложение преобразует вашу информацию — название книги, идентификатор, информацию о банковском счете — в данные: номер заказа, цену со скидкой, характеристики транзакции с использованием кредитной карточки и количество оставшихся в наличии экземпляров книги. Аналогичным образом, приложение преобразует данные в запрос на выборку со склада, отметку об отгрузке и номер отслеживания — информацию, необходимую для реализации продажи.
В действительности сложность создания приложения прямо пропорциональна преобразованиям, которые оно выполняет. Гостевая книга Web-сайта, передающая имя и адрес в поля базы данных, устроена элементарно. С другой стороны, онлайновый магазин, который передает большое количество видов информации в модель данных коммерческой сделки и преобразует данные в информацию для реализации процесса принятия решений, достаточно сложен с точки зрения разработки. Искусство программирования заключается в умелом манипулировании данными и информацией — мастерство, схожее с фиксацией света в живописи.
Как было сказано в первой части, регулярные выражения являются одним из самых мощных средств манипулирования данными. Регулярные выражения лаконично описывают форму данных и раскладывают их на составляющие. Например, следующее регулярное выражение можно использовать для обработки температуры, заданной в градусах по Цельсию или по Фаренгейту: /^([+-]?[0-9]+)([CF])$/.
Регулярное выражение сравнивает начало строки (отображается знаком "крышка" (^), за которым идет знак "+", знак "-", или ничего ([+-]?), за которым следует целое число ([0-9]+), обозначение шкалы — Цельсия или Фаренгейта ([CF]) — и заканчивается концом строки (обозначается знаком доллара $).
В данном регулярном выражении операторы начала строки и конца строки представляют собой примеры операторов нулевой ширины или совпадений по положению, а не по символам. Круглые скобки также не указывают на символы. Зато, если заключить шаблон в круглые скобки, то будет извлечен текст, соответствующий шаблону. Следовательно, если текст полностью сопоставим с шаблоном, то первая пара круглых скобок выдаст строку, представляющую собой положительное или отрицательное целое число, например, +49, а вторая пара круглых скобок - или букву C, или F.
В первой части серии представлено понятие регулярного выражения и были описаны PHP-функции для сравнения текста с шаблонами, а также для извлечения совпадений. А теперь давайте углубимся в изучение регулярных выражений и посмотрим на некоторые "продвинутые" операторы и средства.
Круглые скобки опять приходят на помощь
В большинстве случаев пара круглых скобок используется для описания части шаблона и получения текста, соответствующего этой части. Однако от круглых скобок не всегда требуется получение части шаблона. Как и в сложной арифметической формуле, круглые скобки можно использовать для группировки условий.
Приведу пример. Догадаетесь, какому типу данных соответствует данное выражение?
/[-a-z0-9]+(?:\.[-a-z0-9]+)*\.(?:com|edu|info)/i
Как можно догадаться, это регулярное выражение определяет имена Интернет-сайтов (только для доменов .com, .edu, и .info). Отличием является использование дополнительного оператора ?:. Квалификатор части шаблона ?: отключает функцию извлечения данных, и тем самым дает круглым скобкам возможность обозначать последовательность действий. Например, в данном случае фраза (?:\.[-a-z0-9]+)* соответствует нулю или более элементам строки, например, ".ibm." Аналогично, фраза \.(?:com|edu|info) обозначает последовательность символов, за которой идет одна из строк com, edu, или info.
Отключение функции извлечения информации может показаться бессмысленным, если не подумать о том, что извлечение информации требует дополнительной обработки. Если программа обрабатывает большое количество данных, то отказ от извлечения может быть целесообразным. Кроме того, если вы имеете дело со сложным регулярным выражением, то отключение функции извлечения информации в некоторых частях шаблона может упростить извлечение тех частей шаблона, которые реально нужны.
Примечание: Модификатор i в конце регулярного выражения делает все сопоставления с шаблоном нечувствительными к регистру. Следовательно, подмножество a-z будет сопоставимо со всеми буквами, независимо от регистра.
В PHP есть и другие модификаторы частей шаблона (subpattern). Используя отладчик регулярных выражений, показанный в первой части данной серии (повторно показан в листинге 1), попробуйте сопоставить регулярное выражение ((?i)edu) со строками "EDU," "edu," и "Edu." Если в начале части шаблона задать модификатор (?i), то сопоставление с шаблоном не будет зависеть от регистра. Чувствительность к регистру восстанавливается, как только заканчивается данная часть шаблона. (Сравните с модификатором / ... /i, который применяется ко всему шаблону.)
Листинг 1. Простой отладчик регулярных выражений
Еще один полезный модификатор части шаблона - это (?x). Он позволяет добавлять в шаблон пробелы, что упрощает чтение регулярных выражений. Таким образом, часть шаблона ((?x) edu | com | info) (обратите внимание на пробелы между операторами дизъюнкции, которые добавлены для удобочитаемости) аналогична (edu|com|info). Для того, чтобы добавлять пробелы и комментарии в регулярное выражение, можно использовать глобальный модификатор / ... /x, см. листинг ниже.
Листинг 2. Добавление пробелов и комментариев
Как видно из листинга, при необходимости модификаторы можно объединять. Если необходимо включить в регулярное выражение символ пробела при использовании модификатора (?x), используйте метасимвол \s для поиска любого пробельного символа и \ (обратный слеш с пробелом) для поиска одного пробела, например, ((?x) hello \ there).
Оглядываемся вокруг
В подавляющем большинстве случаев регулярные выражения используются для проверки или декомпозиции входной информации на отдельные "лакомые кусочки", которые записываются в архив данных или сразу же обрабатываются приложением. Общепринятыми сферами применения являются: обработка полей форм, парсинг XML-кода и анализ протоколов.
Еще одна область применения регулярных выражений - форматирование, нормализация или улучшение читаемости данных. Вместо того чтобы использовать регулярные выражения для поиска и извлечения текста, при форматировании они применяются для поиска и вставки текста в надлежащее местоположение.
Вот пример полезного применения форматирования. Предположим, что Web-форма передает приложению значение зарплаты с округлением до целого доллара. Так как зарплата хранится в виде числа целого типа, то перед сохранением переданных данных приложение должно удалять из них знаки пунктуации. Однако при извлечении данных из хранилища, возможно, понадобится изменить их формат и сделать удобочитаемыми с помощью разделителей. В листинге 3 показано, как простой PHP-запрос преобразует сумму в долларах в число.
Листинг 3. Преобразование суммы в долларах в число
Вызов функции preg_replace() заменяет знак доллара, любой пробельный символ и все запятые -- на пустую строку, возвращая то, что предположительно является целым числом. Если проверка функцией is_numeric() подтверждает правильность входных данных, их можно сохранить.
А теперь давайте выполним обратную операцию - добавим к числу знак денежной единицы и запятые-разделители сотен, тысяч и миллионов. Для добавления запятых в определенных позициях можно написать программу для поиска этих компонентов, а можно воспользоваться операторами посмотри вперед и посмотри назад. Модификатор части шаблона ?<= обозначает посмотри назад (то есть влево) от текущей позиции. Модификатор ?= означает "посмотри вперед" (то есть вправо) от текущей позиции.
[pagebreak]
Итак, какие позиции нам нужны? Любое место в строке, при условии, что есть как минимум один символ слева и одна или более групп по три символа справа, не считая десятичной точки и количества центов. Соблюдая это правило и используя два модификатора, анализирующих символы справа и слева от определенной позиции и являющихся операторами нулевой ширины, мы можем достичь цели с помощью следующей инструкции:
Как работает это регулярное выражение? Начиная с первого символа строки и обрабатывая каждый символ, регулярное выражение отвечает на вопрос: "Есть ли хотя бы один символ слева и одна или несколько групп из трех символов справа?" Если да, то наш оператор нулевой ширины заменяется запятой.
Большинство сложных сопоставлений можно реализовать, используя стратегию, аналогичную приведенной выше. Например, вот еще один вариант использования оператора "посмотри вперед", который решает широко распространенную дилемму.
Листинг 4. Пример использования оператора "посмотри вперед" ("предвидение")
Оператор preg_replace() преобразует строку данных, разделенных запятыми, в строку данных, разделенных знаком табуляции. Предусмотрительным образом, он не заменяет запятые в строке, заключенной в кавычки.
Это регулярное выражение при каждом обнаружении запятой (на это указывает запятая в самом начале регулярного выражения) проверяет утверждение: "Впереди не было кавычек или было четное количество кавычек". Если утверждение верно, то запятую можно заменить знаком табуляции (the \t).
Если Вам не нравятся операторы «посмотри вперед» и «посмотри назад» или вы работаете с таким языком, в котором их нет, можно добавить запятые в число и с помощью обычного регулярного выражения. Однако для реализации такого решения потребуется много итераций.
Листинг 5. Добавление запятых
Давайте пройдем по коду. Сначала параметр зарплаты очищается от знаков пунктуации для моделирования ситуации чтения целого числа из базы данных. Затем выполняется цикл в поисках позиций, где за одним числовым символом ((\d) идут три числовых символа ((\d\d\d\): если обнаруживается граница слова, заданная как \b, цикл прекращается. Граница слова -- это еще один оператор нулевой ширины, который соответствует следующим позициям:
* Перед первым символом строки, если это буква слова.
* За последним символом строки, если это буква слова.
* Между буквой слова и небуквенным символом, непосредственно за буквой слова.
* Между небуквенным символом и буквой слова, непосредственно за небуквенным символом.
Таким образом, примерами правильных границ слова являются пробел, точка и запятая.
Благодаря внешнему циклу регулярное выражение перемещается слева направо в поисках цифры, за которой идут три цифры и граница слова. При обнаружении совпадения между двумя частями шаблона добавляется запятая. Цикл должен продолжаться до тех пор, пока оператор preg_replace() находит совпадения, что задано в условии $old != $pretty_print.
Жадность и лень
Регулярные выражения обладают большими возможностями, иногда даже слишком большими. Например, давайте рассмотрим, что произойдет, если регулярное выражение ".*" будет обрабатывать строку "The author of 'Wicked' also wrote 'Mirror, Mirror.'" Вероятно, вы предполагаете, что preg_match() вернет два совпадения, и с удивлением обнаружите, что результат всего один: 'Wicked' also wrote 'Mirror, Mirror.'
Почему? Если не задать иное, то такие операторы как * (ноль или более) и + (один или более) -- "жадные". Если сопоставление с образцом может продолжаться, то они и будут его продолжать до тех пор, пока не будет возвращен максимальный результат из возможных. Для сохранения минимальных совпадений необходимо принудительно заставлять определенные операторы быть "ленивыми". "Ленивые" операторы находят самое короткое совпадение и на этом останавливаются. Чтобы сделать оператор более "ленивым", добавьте суффикс в виде знака вопроса. Пример показан в листинге 6.
Листинг 6. Добавление суффикса в виде знака вопроса
Регулярное выражение ".*?" расшифровывается следующим образом: "найти кавычку, за которой идет ровно столько символов с последующей кавычкой.
Однако иногда оператор * может быть слишком "ленивым". Например, посмотрите на следующий фрагмент кода. Что он делает?
Листинг 7. Простой отладчик регулярных выражений
Что вы загадали? "123"? "1"? Нет результата? На самом деле результатом будет Array ( [0] => [1] => ), означающий, что совпадение было найдено, но никаких данных извлечено не было. Почему? Вспомните, что оператор * ищет совпадения с нулем или более символов. В данном случае, выражение [0-9]* находит совпадение с нулем символов от начала строки, и обработка заканчиваетс.
Для решения данной проблемы добавьте оператор нулевой ширины для привязки совпадения, который заставляет регулярное выражение продолжать сопоставления; /([0-9]*\b/.
Советы и рекомендации
С помощью регулярных выражений можно решать как простые, так и сложные задачи при обработке текста. Начните с небольшой группы операторов и по мере того, как вы будете набираться опыта, расширяйте свой словарь. В качестве вознаграждения за ваши старания -- некоторые советы и рекомендации.
Создание переносимых регулярных выражений с помощью классов символов
Вам уже знакомы метасимволы, например, \s - соответствует любому пробельному символу. Кроме того, большинство реализаций регулярных выражений поддерживает предопределенные классы символов, которые более просты в использовании и переносимы с одного письменного языка на другой. Например, класс символов [:punct:] замещает все символы пунктуации в данном языке. Вместо [0-9] можно использовать [:digit:] и более переносимое замещение [:alpha:] вместо [-a-zA-Z0-9_]. Например, можно убрать все знаки пунктуации, используя:
Класс символов представляет собой более сжатую форму по сравнению с подробным описанием всех символов пунктуации. Полный перечень классов символов можно найти в документации по версии языка PHP.
Как исключить то, что вы не ищете
Как показано в примере с данными, разделенными символом табуляции, в качестве значений, разделенных запятыми (CSV), иногда проще и точнее задать список тех вариантов, которые не нужно находить (сопоставлять). Последовательность, начинающаяся со знака "крышка" (^) будет соответствовать любому символу, не принадлежащему данной последовательности. Например, для проверки правильности телефонных номеров для США можно использовать регулярное выражение /[2-9][0-9]{2}[2-9][0-9]{2}[0-9]{4}/. Используя набор ограничений можно написать регулярное выражение в более явном виде /[^01][0-9]{2}[^01][0-9]{2}[0-9]{4}/. Оба регулярных выражения работают, хотя смысл последнего, вероятно, более понятен.
Пропуск новой строки
Если во входных данных несколько строк, стандартного регулярного выражения будет недостаточно, так как сканирование прекращается на начале новой строки, которая обозначается $. Однако, если воспользоваться модификаторами s или m, то регулярное выражение будет обрабатывать входные данные по-другому. Первый модификатор рассматривает строковую последовательность как одну строку, где точка указывает на начало новой строки (обычно она этого не делает). Второй рассматривает строковую последовательность как несколько строк, где ^ и $ соответствуют началу и концу любой строки, соответственно. Приведем пример. Если задать $string = "Hello,\nthere";, то оператор preg_match( "/.*/s", $string, $matches) параметру $matches[0] присвоит значение Hello,\nthere. (При удалении s будет выдано Hello.)
Поиск по шаблону является настолько обычным занятием в разработке программного обеспечения, что для облегчения этой задачи была создана специальная технология — регулярные выражения. Узнайте, как можно использовать ее при написании кода, прочитав эту статью.
Все устройства получают входную информацию, выполняют какие-либо операции и выдают результат. Например, телефон во время разговора преобразует звуковую энергию в электрический сигнал и обратно. Двигатель потребляет топливо (пар, расщепление атомных ядер, бензин, мышечные усилия) и преобразует его в энергию. Блендер поглощает ром, лед, лайм и кюрасао и взбалтывает их в коктейль Mai Tai. (Или, если вам хочется чего-то изысканного, сделайте Bellini из шампанского и грушевого сока. Блендер – замечательное универсальное устройство.)
Так как программное обеспечение преобразует данные, то каждое приложение фактически является устройством (хоть и виртуальным, так как у него нет физических составляющих). Например, компилятор в качестве входной информации получает исходную программу и преобразует ее в двоичный исполняемый код. Программа прогнозирования погоды генерирует предсказания на основе результатов прошлых (исторических) замеров, а графический редактор обрабатывает пикселы, применяя правила к отдельным пикселам или их группам, чтобы, например, сделать изображение более четким или изменить его стиль.
Так же, как и любое другое устройство, программное обеспечение предназначено для работы с определенным исходным материалом, например, набором чисел, данными XML-схемы или протоколом. Если программе задать некорректную входную информацию — неподходящую по форме или типу, то существует большая вероятность того, что результат будет непредсказуемым и, возможно, даже катастрофическим. Как говорится: "Мусор заложишь - мусор получишь".
На самом деле для решения всех нетривиальных задач необходимо отделять правильные данные от некорректных и отклонять некорректные данные во избежание ошибок в результатах. Это, конечно же, актуально и для Web-приложений, написанных на языке PHP. Неважно, получены ли входные данные из формы для ввода с клавиатуры или в результате выполнения программного запроса Asynchronous JavaScript + XML (Ajax), прежде чем начать какие-либо вычисления, программа должна проверить входную информацию. Возможно, что числовые значения должны находиться в пределах определенного диапазона чисел или представлять собой только целые числа. Возможно, значение должно соответствовать определенному формату, например, почтового индекса. Например, почтовый индекс в США представляет собой пять цифр плюс дополнительный префикс "Plus 4", состоящий из дефиса и 4 дополнительных цифр. Возможно, другие строки также должны состоять из определенного количества символов, например, две буквы для указания аббревиатуры штата США. Строковые данные доставляют особенно много проблем: PHP-приложение должно быть начеку по отношению к злонамеренным программам-агентам, вложенным в SQL-запросы, код JavaScript или любой другой код, которые способны изменить поведение приложения или обойти защиту.
Однако каким образом программа может определить, являются ли входные данные числом или соответствуют ли определенным требованиям, например, к почтовому индексу? На самом деле для реализации проверки путем сопоставления с шаблоном необходим небольшой парсер, создающий конечный автомат, считывающий входные данные, обрабатывающий маркеры, отслеживающий состояние и выдающий результаты. Однако создание и обслуживание даже самого простого парсера может оказаться непростым делом.
К счастью, анализ на основе сопоставления с шаблоном настолько широко распространен в компьютерных технологиях, что с течением времени (примерно с момента появления UNIX®) были разработаны специальные технологии и, конечно же, механизмы обработки, чтобы облегчить рутинную работу. Регулярное выражение (regex) описывает шаблоны посредством лаконичных и удобочитаемых обозначений. Получив регулярное выражение и данные, механизм regex сообщает, совпадают ли эти данные с шаблоном, и если совпадение было обнаружено, что именно совпало.
Вот небольшой пример использования регулярного выражения, взятый из UNIX-утилиты, работающей в режиме командной строки, которая ищет заданный шаблон в содержимом одного или нескольких текстовых файлов UNIX. Команда grep -i -E '^Bat' ищет последовательность символов beginning-of-line (начало строки), обозначаемое "крышкой", [^]), за которым следуют буквы b, a, и t верхнего или нижнего регистра (ключ -i указывает на то, что при сопоставлении с шаблоном регистр не учитывается, таким образом, например, B и b - тождественны). Следовательно, для файла heroes.txt:
Листинг 1. heroes.txt
Вышеупомянутая команда grep выдаст два совпадения:
Batman
Batgirl
Регулярные выражения
PHP предлагает два программных интерфейса регулярных выражений: один -- для интерфейса переносимых операционных систем (POSIX), а второй - для регулярных выражений, совместимых с языком Perl (PCRE). В общем и целом второй интерфейс является более предпочтительным, так как PCRE сам по себе мощнее, чем POSIX, и предоставляет все операторы, используемые в языке Perl. Более подробная информация по обращению к regex-функциям POSIX представлена в документации по языку PHP (см. раздел Ресурсы). В данной статье мы сосредоточим свое внимание на свойствах PCRE.
Регулярные выражения PHP PCRE содержат операторы, позволяющие путем сопоставления находить конкретные символы или другие операторы, определенные местоположения, например, начало и конец строки, начало или конец слова. Регулярные выражения также позволяют описывать альтернативы, которые можно задать альтернативы типа "или"-"или"; повторения фиксированной, изменяемой или неопределенной длины; наборы символов (например, "любая буква от a до m"); и классы, или типы символов (печатаемые символы, знаки препинания). Специальные операторы также разрешают использовать группировку — возможность применить оператор к целой группе других операторов.
В таблице 1 показаны некоторые типичные операторы регулярных выражений. Для создания сложных выражений можно последовательно объединять элементарные операторы из таблицы 1 (и другие).
Таблица 1. Типичные операторы регулярных выражений
Оператор Значение
. (точка) Любой одиночный символ
^ (крышка) Пустая последовательность в начале строки или цепочки
$ (знак доллара) Пустая последовательность в конце строки
A Буква A верхнего регистра
a Буква a нижнего регистра
\d Любая цифра
\D Любой нецифровой символ
\w Любая буква или цифра; синоним - [:alnum:]
[A-E] Любая заглавная буква из A, B, C, D или E
[^A-E] Любой символ, за исключением заглавных букв A, B, C, D или E
X? Найти совпадение по отсутствию или наличию одной заглавной буквы X
X* Ни одной или любое количество заглавных букв X
X+ Одна или несколько заглавных букв X
X{n} Ровно n заглавных букв X
X{n,m} Не менее n и не более m заглавных букв X; если опустить m, то выражение будет искать не менее n заглавных букв X
(abc|def)+ По меньшей мере одно вхождение последовательности abc и def
В следующем примере показано типичное использование регулярного выражения. Например, для web-сайта необходимо, чтобы каждый пользователь регистрировался. Имя пользователя должно начинаться с буквы и содержать от 3 до 10 буквенно-цифровых символов. Для проверки имени пользователя на соответствие ограничениям при отправке данных в приложение можно использовать следующее регулярное выражение: ^[A-Za-z][A-Za-z0-9_]{2,9}$.
Знак "крышка" соответствует началу строки. Первый набор [A-Za-z] соответствует любой букве. Второй набор [A-Za-z0-9_]{2,9} соответствует последовательности, содержащей от 2 до 9 букв, цифр или символов подчеркивания. Знак доллара ($) соответствует концу строки.
На первый взгляд, знак доллара может показаться лишним, однако его использование важно. Если его пропустить, то условиям данного регулярного выражения будет отвечать любая строка, которая начинается с буквы, содержит от 2 до 9 буквенно-цифровых символов и любое количество других символов. Иными словами, если бы не было знака доллара как привязки к концу строки, то подошла бы недопустимо длинная строка с подходящим началом, например, "martin1234-cruft" .
Программирование на языке PHP и регулярные выражения
В PHP есть функции для поиска совпадений в тексте, замены каждого совпадения на другой текст (похоже на операцию "найти и заменить") и поиска совпадений среди элементов списка. Вот эти функции:
Чтобы показать, как работают эти функции, давайте создадим небольшое PHP-приложение, которое будет просматривать список слов на соответствие определенному шаблону. Слова и регулярные выражения будут вводиться из обычной web-формы, а результаты отображаться в браузере посредством функции simple print_r(). Эта программка пригодится, если возникнет желание проверить или отладить регулярное выражение.
PHP-код показан в листинге 2. Все входные данные берутся из обычной HTML-формы. (Для краткости эту форму и PHP-код, отслеживающий ошибки, опустим.)
Листинг 2. Сравнение текста с шаблоном
Вначале с помощью функции preg_split() строка из слов, разделенных запятыми, преобразуется в отдельные элементы. Данная функция разбивает строку в тех местах, которые соответствуют условиям регулярного выражения. В данном случае регулярное выражение представляет собой просто "," , (запятая - разделитель списка слов, указанных через запятую). Слэш в начале и в конце просто показывает начало и конец regex.
Третий и четвертый аргументы функции preg_split() необязательны, но полезны. Добавьте в третий аргумент число n целого типа, если необходимо вернуть только первые n совпадений, или -1, если необходимо вернуть все совпадения. Если в качестве четвертого аргумента задать идентификатор PREG_SPLIT_NO_EMPTY, то функция preg_split() не будет возвращать пустые результаты.
Затем каждый элемент списка слов, разделенных запятыми, корректируется (убираются начальные и конечные пробелы) с помощью функции trim() и сравнивается с заданным регулярным выражением. Функция preg_grep() существенно упрощает процесс обработки списка: просто укажите в качестве первого аргумента шаблон, а в качестве второго - массив слов для сравнения. Функция возвращает массив совпадений.
Например, если в качестве шаблона задать регулярное выражение ^[A-Za-z][A-Za-z0-9_]{2,9}$ и список слов разной длины, то можно получить результат, показанный в листинге 3.
Листинг 3. Результат работы простого регулярного выражения
Кстати, с помощью дополнительного маркера PREG_GREP_INVERT можно инвертировать операцию preg_grep() и найти элементы, которые не совпадают с шаблоном (аналогично оператору grep -v в командной строке). Заменяя 22 строку на $matches = preg_grep( "/${_REQUEST[ 'regex' ]}/", $words, PREG_GREP_INVERT ) и используя входные данные из листинга 3, мы получим Array ( [1] => 1happy [2] => hermanmunster ).
Разбор строк
Функции preg_split() и preg_grep() очень удобны. Первая из них может разбирать строку на подстроки, если подстроки разделяются определенным шаблоном. Функция preg_grep() позволяет быстро отфильтровать список.
Но что произойдет, если строку нужно разобрать на составные части, используя одно или несколько сложных правил? Например, в США номера телефонов обычно выглядят следующим образом: "(305) 555-1212," "305-555-1212," или "305.555.1212." Если убрать пунктуацию, то количество символов сократится до 10 цифр, что легко можно определить с помощью регулярного выражения \d{10}. Однако код и префикс (каждый из которых состоит из трех цифр) телефонного номера США не могут начинаться с нуля или единицы (так как нуль и единица используются как префиксы для междугородных звонков). Вместо того чтобы разбивать числовую последовательность на отдельные цифры и создавать сложный код, для верификации можно использовать регулярное выражение.
Фрагмент кода позволяющий решить эту задачу, показан в листинге 4.
Листинг 4. Проверка американского телефонного номера
Давайте пройдем по этому коду:
* Как показано в таблице 1, в регулярных выражениях используется ограниченный набор специальных символов, например, квадратные скобки ([ ]) для наименования последовательности. Если надо найти такой символ в тексте, необходимо "выделить" специальный символ в регулярном выражении, поставив перед ним обратный слэш (\). Когда символ выделен, можно задать его посик, как и любого другого символа. Если нужно найти символ точки, например, в полном составном имени хоста, то напишите \.. При желании строку можно подать в функцию preg_quote() которая выполняет автоматическую изоляцию всех специальных символов регулярных выражений, как показано в строке 1. Если поставить echo() $punctuation после первой строки, то вы должны увидеть \(\)\.-.
* В строке 2 из телефонного номера убираются все знаки пунктуации. Функция preg_replace() заменяет все символы из $punctuation — операторы из набора [ ] - пустой строкой, эффективно устраняя такие символы. Возвращаемая новая строка присваивается переменной $number.
* В строке 4 определен шаблон верифицируемого телефонного номера США.
* Строка 5 реализует сопоставление, сравнивая телефонный номер, который теперь состоит только из цифр, с шаблоном. Функция preg_match() возвращает 1, если есть совпадение. Если совпадения нет, функция preg_match() возвращает нулевое значение. Если во время обработки возникла ошибка, то функция возвращает значение False (ложно). Таким образом, чтобы проверить удачное завершение, необходимо посмотреть, было ли возвращено значение 1. В противном случае проверьте итоговое значение функции preg_last_error() (если используется PHP версии 5.2.0 или выше). Если оно не равно нулю, то, возможно, был превышен лимит вычислений, например, разрешенная глубина рекурсии регулярного выражения. Обсуждение констант и ограничений, применяемых в регулярных выражениях PHP, представлено на странице, посвященной функциям регулярных выражений PCRE (см. раздел Ресурсы).
Извлечение данных
Во многих случаях необходимо только получить ответ на вопрос: "Соответствуют ли данные шаблону?" – например, при проверке данных. Однако чаще регулярные выражения используются для подтверждения соответствия и получения информации о совпадении.
Вернемся к примеру с телефонным номером. Пусть при соответствии шаблону нам необходимо сохранить код, префикс и номер линии в отдельных полях базы данных. Регулярные выражения могут запоминать совпадающие с шаблоном данные с помощью оператора capture. Оператор capture обозначается круглыми скобками и может использоваться в любой части регулярного выражения. Операции capture можно делать вложенными для поиска подсегментов в извлеченных сегментах данных. Например, чтобы из 10-значного номера телефона извлечь код города, префикс и номер линии, можно использовать следующую строку:
/([2-9][0-9]{2})([2-9][0-9]{2})([0-9]{4})/
Если входные данные соответствуют шаблону, первые три цифры захватываются первой парой круглых скобок, следующие три цифры - второй парой, а последние 4 цифры - последним оператором. Модификация вызова функции preg_match() возвращает извлеченные данные.
Листинг 5. Возврат извлеченных данных функцией preg_match()
Если в качестве третьего аргумента функции preg_match() указать переменную, например, в нашем коде, $matches, то в качестве ее значения будет выступать список извлеченных результатов. Нулевой элемент списка (с индексом 0) - это все совпадение целиком; первый элемент - совпадение, относящееся к первой паре круглых скобок, и так далее.
Вложенные операторы capture извлекают сегменты и подсегменты фактически любой глубины. Сложность с вложенными операторами capture состоит в том, чтобы определить, в какой части массива соответствий находится каждое соответствие, например, $matches. Действует следующее правило: подсчитайте порядковый номер открывающей скобки в регулярном выражении — этот номер и будет индексом нужного совпадения в массиве соответствий.
В листинге 6 показан пример (немного надуманный) извлечения частей городского адреса.
Листинг 6. Код для извлечения городского адреса
Опять все совпадение целиком хранится по индексу 0. А где хранится номер улицы? Если считать слева направо, номер улицы проверяется \d+. Это вторая открывающая круглая скобка слева, следовательно, значением $matches[2] будет 123. В $matches[4] оказывается название города, а в $matches[6] - почтовый индекс.
Продвинутые технологии
Обработка текста – широко распространенная задача, и PHP предоставляет ряд функций, упрощающих выполнение большого числа операций. Обратите внимание на следующее:
* Функция preg_replace() может работать как с одной строкой, так и с массивом строк. Если вызвать preg_replace() для массива строк, замена будет выполнена во всех элементах массива. В этом случае код preg_replace() возвращает массив измененных строк.
* Как и во всех остальных реализациях PCRE, здесь для осуществления замены можно прибегать к сравнению с вложенным шаблоном. Для наглядности давайте рассмотрим проблему стандартизации формата телефонного номера. Заменим все знаки пунктуации точками. Наше решение показано в листинге 7.
Листинг 7. Замена знаков пунктуации точками
Сопоставление с шаблоном и, в случае совпадения, перевод в стандартный телефонный номер выполняется за один шаг.
chmod играет важную роль при программировании на языке php. Особого внимания заслуживают случаи работы с файлами, особенно при настройке движков сайтов (CMS), форумов, гостевых книг и пр. Заметим, что chmod используется языком php только в Unix-подобной операционной системе, для которой и описаны приведенные ниже примеры. Заметим, что хостинг, в основном, базируется на Unix-подобной операционной системе.
В этих примерах показаны только принципы программирования в php при работе с chmod. В силу особенностей языка php права доступа в нем записывается только в числовом формате, поэтому рекомендуем символьный формат chmod предварять символом 0.
Читатели должны осознавать тот факт, что при программировании они должны использовать функции для определения наличия проверяемого файла, наличия переменных, приведения типов и пр.
Изменение chmod
chmod можно выставлять средствами языка php. Это можно делать только на уровне файловой системы сервера; изменение chmod для удаленных файлов не допускается.
Функция chmod() пытается изменить права доступа для filename на указанные в параметре mode. В случае успешного завершения функция возвращает true, в случае ошибки функция возвращает false. Поскольку числовой формат записи chmod является восьмеричным числом значение параметра mode рекомендуется предварять симоволом 0.
В указанном примере первая функция установит chmod 644 для файла /contacts/index.php. Вторая функция возвратит false, так как нельзя указавать в качестве параметра удаленные файлы. Третья функция установит chmod 467 для каталога /contacts/; во избежание недоразумений лучше всегда записывать в качестве второго параметра восьмеричное число, предваряя его симоволом 0. Четвертая фунция возвратит false, так как в качестве второго параметра обятельно надо указывать числовое значение.
Определение chmod
Для определения chmod воспользуемся функцией fileperms().
Функция fileperms() возвращает информацию о filename либо false в случае ошибки. Заметим, что получение информации об удаленных файлах не допускается.
Функция fileperms() возвращает больше информации, чем нам требуется (ее мы не будем затрагивать). Нам требуется определить последние 9 бит. Для этого воспользуемся логическим оператором & и функцией decoct().
Обращаем внимание, что функция decoct() возвращает переменную строкового типа (в которой записаны права доступа в числовом формате), поэтому при использовании полученных результатов в функции chmod() необходимо либо использовать функцию octdec(), либо не использовать функцию decoct(). Приведенные ниже два примера эквивалентны.
В приведенном выше примере в переменной $perms записана строка, состоящая из трех символов. Данный способ необходимо использовать в случаях, когда необходимо получить chmod в числовом формате, а затем использовать переменную для изменения chmod.
Данный пример предпочтительнее предыдущему, его необходимо использовать в случаях, когда переменная $perms используется исключительно для изменения прав доступа без промежуточных действий.
Доступность оборудования и простота организации делают беспроводные локальные сети всё более популярными. Даже небольшие компании стараются идти в ногу со временем и избавляются от традиционных кабельных "локалок". Использование беспроводных сетей не ограничивается небольшими офисами и домашними системами - крупные же фирмы применяют Wi-Fi для подключения к корпоративным сетевым ресурсам в тех местах, где технически невозможна прокладка кабелей.
Однако решение об устройстве беспроводной сети далеко не всегда оправданно, тем более что во многих случаях безопасности таких сетей уделяется слишком мало внимания. По оценкам специалистов, почти 70 процентов удачных хакерских атак через беспроводные сети связаны с неправильной настройкой точек доступа и клиентского программного обеспечения, а также с установкой чересчур низкого уровня безопасности при слишком сильном сигнале, с лёгкостью "пробивающего" стены офиса.
По каким-то необъяснимым причинам организаторы беспроводных сетей нередко считают, что при их включении автоматически обеспечивается надлежащий уровень безопасности. Производители оборудования, в свою очередь, устанавливают низкие настройки безопасности "по умолчанию", либо вовсе отключают их, чтобы при развёртывании сети клиенты случайно не столкнулись с невозможностью доступа. При минимальных настройках безопасность оборудование лучше всего совместимо с самым широким спектром других устройств и практически с любым современным программным обеспечением. Поэтому после настройки и проверки сети на совместимость с существующей инфраструктурой системный администратор должен изменить настройки безопасности, для того чтобы предотвратить несанкционированное проникновение в корпоративную сеть.
В отличие от проводных сетей, беспроводные требуют повышенного внимания к безопасности, поскольку проникнуть в них гораздо проще, поскольку для этого не нужен физический доступ к каналу. Радиоволны можно принимать на любое совместимое устройство, а если данные не защищены, то их сможет перехватить любой желающий. Разумеется, не стоит отказываться от паролей прочих традиционных средств авторизации, однако их явно недостаточно для защиты от несанкционированного доступа. Рассмотрим вкратце несколько способов повышения защищённости беспроводных сетей.
Отключаем передачу SSID
Последовательность цифр и букв, называемая SSID (Service Set Identifier) - это уникальный идентификатор вашей беспроводной сети. Передача идентификатора сети является встроенным средством защиты, по умолчанию включённым в большей части продающегося сегодня оборудования, и оно позволяет с лёгкостью обнаружить имеющиеся точки доступа в процессе развёртывания сети. Передача SSID требуется именно для того, чтобы ваше оборудование смогло подключиться к сети.
Точки доступа, которые являются базовыми станциями для подключаемых к сети компьютеров, являются потенциальным слабым местом, через которое злоумышленник может проникнуть в сеть. На уровне точек доступа отсутствует система авторизации по умолчанию, что делает внутренние сети незащищёнными, поэтому системные администраторы должны реализовать существующую корпоративную систему в беспроводных базовых станциях.
Для обеспечения повышенной безопасности можно запретить трансляцию точками доступа идентификатора сети. При этом возможность подключения к сети остаётся только у тех, кто знает правильный SSID, то есть, у сотрудников вашей компании, а случайные пользователи, обнаружившие вашу сеть при помощи сканирования, просто не смогут получить к ней доступ. Отключение передачи SSID возможно в подавляющем большинстве устройств ведущих производителей, что позволяет фактически скрыть вашу сеть от чужих. Если ваша сеть не передаёт идентификаторов, и если вы не афишируете использование беспроводной технологии, то этим вы осложните задачу злоумышленников. Подробные инструкции по отключению SSID обычно приводятся в руководствах по эксплуатации беспроводных точек доступа или маршрутизаторов.
Включаем средства шифрования
Уже давно используемое при пересылке важной электронной корреспонденции шифрование данных нашло применение и в беспроводных сетях. Для защиты данных от чужих глаз, в аппаратуре для беспроводной связи реализованы различные криптографические алгоритмы. При покупке оборудования важно убедиться в том, что оно поддерживает не только низкоуровневое 40-разрядное шифрование, но и 128-битный шифр повышенной стойкости.
Чтобы включить криптографическую защиту можно задействовать системы WEP (Wired Equivalent Privacy - "эквивалент проводной безопасности") или WPA (Wi-Fi Protected Access - "защищённый доступ к Wi-Fi"). Первая система менее стойкая, поскольку в ней используются статические (постоянные) ключи. Защищённые по этому протоколу сети взламываются хакерами без особого труда - соответствующие утилиты нетрудно найти в интернете. Тем не менее, по оценкам специалистов, даже этот протокол не задействован в более половины работающих корпоративных беспроводных сетей. Одним из средств повышения действенности WEP является регулярная автоматическая смена ключей, но даже в этом случае сеть не получает стопроцентной защиты. Попытки проникнуть в такую сеть оставят лишь случайные люди, обнаружившие её, но злонамеренных специалистов WEP не остановит, поэтому для полноценной защиты корпоративных сетей данный протокол использоваться не может.
В недалёком прошлом у организаторов беспроводных сетей не было иного выбора, как использовать протокол WEP, поддержка которого сохраняется в современных устройствах как в целях обеспечения совместимости оборудования, так и для обеспечения хотя бы минимального уровня безопасности в случае невозможности использования более современных протоколов. Сегодня WEP реализуется в двух модификациях: с 64- и 128-разрядным шифрованием. Однако корректнее было бы говорить о ключах длиной 40 и 104 бит, поскольку 24 бит из каждого ключа содержат служебную информацию и никак не влияют на стойкость кода. Однако это не столь важно, поскольку главным недостатком WEP являются статические ключи, для подбора которых злоумышленникам необходимо лишь в течение определённого времени сканировать сеть, перехватывая передаваемую информацию.
Повторим, что более-менее приемлемый уровень безопасность можно лишь при помощи регулярной смены ключей и при использовании 128-битного шифрования. Частота смены ключей зависит от частоты и длительности соединений, при этом необходимо обеспечить отработанную защищённую процедуру передачи новых ключей тем сотрудникам, которые пользуются доступом в беспроводную сеть.
Более эффективное шифрование обеспечивает протокол WPA, в котором реализовано динамическое создание ключей, что исключает возможность перехвата или подбора ключа, а также система идентификации (логин-пароль) при подключении к сети на основе протокола EAC (Extensible Authentication Protocol - "расширяемый протокол аутентификации"). В протоколе WPA 128-разрядные ключи генерируются автоматически при передаче каждых десяти килобайт данных, причём число этих ключей достигает сотен миллиардов, что делает практически невозможным подбор при помощи сканирования даже при отработанной методике перехвата информации. Кроме того, в этом протоколе реализован алгоритм проверки целостности данных MIC (Message Integrity Check), предотвращающий возможность злонамеренного изменения передаваемых данных. А вот выбору паролей следует уделять особое внимание: по мнению экспертов, для обеспечения высокого уровня безопасности длина пароля должна составлять не менее 20 знаков, причём он не должен представлять собой набор слов или какую-то фразу, поскольку такие пароли легко вскрываются методом словарного подбора.
Проблема с WPA заключается в том, что официально он был внесён в спецификации IEEE 802.11 лишь в середине 2004 года, поэтому далеко не всё беспроводное оборудование, выпущенное более полутора лет назад, способно работать по этому стандарту. Более того, если в сети есть хотя бы одно устройство, не поддерживающее WPA, будет применяться простое шифрование WEP, даже если WPA включён в настройках всего прочего оборудования.
Тем не менее, оборудование постоянно совершенствуется и в современных устройствах поддерживается новая, ещё более защищённая версия WPA2, работающая с динамическими ключами длиной 128, 192 и 256 бит. К таким устройствам, относится, например, трёхдиапазонный контроллер Intel PRO/Wireless 2915ABG.
Регулируем силу сигнала и его направленность
Технология беспроводной связи сама по себе по своей природе меньше защищена от постороннего вмешательства, поэтому при организации таких сетей особенно важно максимально затруднить несанкционированное проникновение в них. Среди чисто технических способов самым эффективным является снижение мощности транслируемого сигнала, ведь радиоволны с лёгкостью преодолевают стены зданий, а в сельской равнинной местности могут преодолевать весьма большие расстояния. Злоумышленники могут поставить свой автомобиль рядом со зданием, в котором расположен ваш офис, и в комфортной обстановке неторопливо подбирать ключ к вашей сети. Поэтому важно отрегулировать мощность сигнала, чтобы он не проникал за границы вашей территории. Кроме того, точки доступа следует располагать вдалеке от окон, внешних стен зданий, общих коридоров, холлов и лестниц.
Беспроводные сети являются очень удобным средством связи быстрого развёртывания, позволяющим объёдинить в сеть компьютеры даже в тех местах, где по тем или иным причинам невозможна прокладка кабеля. Однако поскольку незащищённые беспроводные сети куда проще поддаются взлому, чем проводные, следует уделять повышенное внимание защите от постороннего проникновения. Разумеется, стопроцентной гарантии безопасности дать невозможно, но некоторые действенные способы затруднения несанкционированного доступа в беспроводные сети мы описали в данном материале. Более подробные инструкции по реализации этих методов на практике обычно приводятся в документации к сетевому оборудованию, поэтому мы не ставили перед собой цели описать конкретные действия, тем более что они различаются в зависимости от модели и производителя беспроводных точек доступа и маршрутизаторов. Надеемся, что этот материал привлечёт внимание к проблеме обеспечения защиты беспроводных сетей.
В этой статье описываются полезные функции и процедуры, помогающие эффективно работать с различными типами данных в системе "1С:Предприятие 7.7".
* Обработка значений
* Форматирование
* Список значений
* Таблица значений
* Таблица
* Период и дата
* Календари и праздники
* Справочники
* Документы
* Предопределённые функции
* Налоговый учёт
Обработка значений в 1С
Форматирование данных в 1С
Список значений в 1С
Таблица значений в 1С
Таблица или печатная форма в 1С
Периоды и даты в 1С
Календари и праздники в 1С
Справочники в 1С
Документы в 1С
Предопределённые функции и процедуры в 1С
Налоговый учёт и первое событие в 1С
Резюме
В статье описаны функции и процедуры, используемые в программе "1С:Предприятие 7.7" для работы со справочниками, документами, списками значений, таблицами значений и с прочими агрегатными типами данных. Образцы практического применения описанных средств Вы сможете найти в статьях "Отчёты для 1С" и "Обработки для 1С".
Представляю на Ваш суд утилиту быстрого поиска по базе данных. Данная технология производит поиск по полям, преобразуя их значения в строки (все значения преобразуются в верхний регистр, включая действительные числа).
Данное решение может быть не самым быстрым, однако на поверку оно оказывается быстрее остальных, обнаруженных мною в Интернете (может вам повезет больше). Более того, представьте, что действительное значение какого-либо поля равно 4.509375354, а значение поиска равно 7, в этом случае утилита засчитает "попадание". Утилита удобна также тем, что она за один проход производит поиск более, чем в одном поле.
Это удобно, если у Вас имеются, к примеру, два поля с адресами. Это моя первая "серьезная" разработка, так как первое, с чем я столкнулся, изучая Delphi, стала необходимость включения процедуры поиска в любое приложение, работающее с базой данных. А так как поиск - вещь тоже сугубо специфическая, как и любое приложение, то мне пришлось побороть свой страх перед "крутым программированием" и попробовать написать свой поисковый механизм, удовлетворивший меня (и, надеюсь, других) своей скоростью и возможностью "мульти"-поиска по нескольким полям.
Я надеюсь, что он поможет тем программистам, кто часто сталкивается с подобными задачами. Технология довольно легка для понимания, но если у Вас возникли какие-либо вопросы, пошлите мне письмо электронной почтой, я буду рад Вам помочь. Посмотрев код, можно легко узнать поддерживаемые типы полей (добавить новые не составит проблем).