пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Единственный совершенный код – это код, который так и не написали. Будучи разработчиком, вы стопроцентно будете совершать ошибки, и, кроме того, вам придется их исправлять. Если вы программируете на Python, то вы всегда можете понять, что происходит, просто взглянув на сообщения об ошибках. Но что, если вы допустите ошибку и даже не будете знать, где конкретно вы ее допустили? Возможно, что-то пошло не так на фоне, но вы не можете понять, что конкретно. Конечно, вы всегда можете перезапустить код, но будет еще лучше, если у вас будет возможность проверить журналы. Что такое ведение журналов? Если вдруг в вашем приложении возникнет ошибка, или оно начнет вести себя странным образом, файлы журналов вам очень сильно пригодятся. Вы можете просмотреть их и узнать, где именно в приложении возникает проблема и как эту проблему можно воспроизвести. Воспроизведя проблему, вы можете копнуть глубже и найти какое-то рациональное решение. В противном случае на поиск решения может уйти несколько часов, а поиск файлов журнала займет всего несколько минут.  Как ведение журналов работает в Django Благо, Django поддерживает функцию ведения журналов, и его разработчики уже проделали большую часть тяжелой работы. У Django есть встроенный модуль Python под названием  logging , который используется для ведения записей в системном журнале.  Этот модуль состоит из четырех основных частей: Регистраторы Обработчики  Фильтры Средства форматирования Каждый из этих компонентов до мелочей описан в официальной документации Django. Я не хочу, чтобы вы ошибочно полагали, что это очень сложно, поэтому я кратко поясню каждый компонент: 1. Регистраторы Регистраторы – это, попросту говоря, точка входа в систему протоколирования. Это то, с чем вы, как разработчики, собственно говоря, будете работать.  Когда регистратор получает сообщение, уровень ведения журнала сравнивается с уровнем ведения журнала регистратора. Если эти уровни совпадают, или если уровень ведения журнала превышает уровень ведения журнала регистратора, то  сообщение отправляется обработчику для дальнейшей работы с ним . Вот так выглядят уровни ведения журнала: DEBUG : низкоуровневая информация о системе INFO : общая информация о системе WARNING : информация о несерьезных проблемах ERROR : информация о серьезных проблемах CRITICAL : информация об опасных проблемах 2. Обработчики Обработчики, строго говоря, определяют, что будет происходить с каждым сообщением в регистраторе. Как и у регистраторов, у обработчиков также есть уровни ведения журнала. При этом мы, в принципе, может определить, как будет обрабатываться каждый уровень.  Например, сообщения уровня  ERROR могут отправляться разработчику в режиме реального времени, а сообщения уровня  INFO могут просто отправляться на хранение в системный файл. По сути, обработчик указывает системе, что нужно сделать с сообщением, например, вывести его на экран, добавить в файл или отправить через сетевой сокет.  3. Фильтры Фильтр можно разместить между  регистратором и  обработчиком . Его используют для того, чтобы фильтровать записи журнала.  Например, вы можете установить фильтр в рамках уровня  CRITICAL , чтобы обрабатывать сообщения из определенного источника. 4. Средства форматирования Как уже можно было понять из названия, средства форматирования отвечают за описание формата текста, который будет отображаться.  А теперь, когда мы разобрались с основами, давайте рассмотрим пример и копнем немного глубже.  Здесь вы можете найти исходный код. Отмечу, что данная статья предполагает наличие базовых знаний Django. Настройка проекта Для начала вам нужно создать виртуальную среду под названием  venv   внутри папки вашего проекта  django-logging-tutorial . Сделать это можно с помощью команды, приведенной ниже. mkdir django-logging-tutorial virtualenv venv source venv/bin/activate Создайте новый проект Django и назовите его  django-logging-tutorial . Обратите внимание, что в имени папки используется тире, а в имени проекта – нижнее подчеркивание. Здесь, чтобы настроить наш проект, мы также запускаем ряд команд.  Как настроить файлы журналов Давайте для начала настроим файл проекта под названием  settings.py . Обратите внимание на комментарии в коде, которые я там оставил. Они помогут вам лучше понять, что там происходит. Этот код также приводится в  третьем примере официальной документации , и он отлично подойдет для большинства наших проектов. Но я немного его изменил, чтобы он стал более надежным. LOGGING = {    'version': 1,    # The version number of our log    { # Номер версии вашего журнала }    'disable_existing_loggers': False,    # django uses some of its own loggers for internal operations. In case you want to disable them just replace the False above with true.    { # Django использует ряд собственных регистраторов для внутренних операций. Если вы хотите их отключить, просто замените в строке выше false на true. }    # A handler for WARNING. It is basically writing the WARNING messages into a file called WARNING.log    { # Обработчик уровня WARNING. Попросту говоря, это запись сообщений уровня WARNING в файл под названием WARNING.log. }    'handlers': {        'file': {            'level': 'WARNING',            'class': 'logging.FileHandler',            'filename': BASE_DIR / 'warning.log',        },    },    # A logger for WARNING which has a handler called 'file'. A logger can have multiple handler    { # Регистратор уровня WARNING, у которого есть обработчик под названием «file». У регистратора может быть несколько обработчиков. }    'loggers': {       # notice the blank '', Usually you would put built in loggers like django or root here based on your needs       { # обратите внимание на пробел. Как правило, встроенные регистраторы, такие как Django или root, размещаются в зависимости от ваших потребностей. }        '': {            'handlers': ['file'], #notice how file variable is called in handler which has been defined above { # обратите внимание на то, как файловая переменная вызывается в обработчике, который был определен выше }            'level': 'WARNING',            'propagate': True,        },    }, } Если вы читали мои комментарии, то могли заметить, что часть, которая относится к регистратору, пустая. По сути, это значит, что использоваться может любой регистратор.  Однако не стоит усердствовать с этим подходом, так как большую часть нашей работы можно выполнить с помощью встроенных регистраторов Django, например,  django.request или  django.db.backends . Кроме того, дабы упростить задачу, я использовал только файл для хранения журналов. Но все зависит от вашего сценария использования. Вы также можете отправлять электронные письма в случае, если вы обнаружили сообщения уровня  CRITICAL или  ERROR .  Я бы посоветовал вам прочитать ту часть документации, где говориться об обработчиках, чтобы узнать о них больше. Сначала вам может показаться, что чтение этой документации – непосильный труд, но чем быстрее вы свыкнетесь с мыслью, что прочитать ее нужно, тем больше других интересных и лучших подходов вы сможете найти. Если вы работаете с документацией впервые, не стоит беспокоиться. Все когда-то бывает в первый раз. Я пояснил большую часть кода комментариями, но мы еще не упомянули, что же такое  propagate . Так что же это? Если значение  propagate установлено как  True , то дочерний элемент будет передавать все свои запросы на внесение в журнал родительскому элементу. Это значит, что мы можем определить обработчик в корне (в родительском элементе) дерева регистратора, и все запросы на внесение в журнал в поддереве (в дочернем элементе) будут отправляться обработчику, который был определен в родительском элементе. Кроме того, очень важно отметить важность иерархии. Мы также может просто установить значение этого параметра в нашем проекте как  True , поскольку в нашем случае это совершенно не важно, так как поддерева просто нет. Как вызывать журналы в Python А теперь, мы должны создать несколько журнальных сообщений, чтобы опробовать нашу конфигурацию, заданную в  settings.py , в деле.  Давайте создадим домашнюю страницу по умолчанию, которая будет просто отображать фразу  «Hello FreeCodeCamp.org Reader :)» , а каждый раз, когда кто-нибудь будет посещать эту страницу, мы будем записывать в наш файл warning.log сообщение уровня  WARNING : «Homepage was accessed at 2021-08-29 22:23:33.551543 hours!».  Перейдите к вашему приложению  logging_example и добавьте в файл  views.py следующий код. Убедитесь в том, что вы добавили  logging_example в  INSTALLED_APPS , который находится внутри  setting.py . from django.http import HttpResponse import datetime # import the logging library { # импорт библиотеки logging } import logging # Get an instance of a logger { # получаем экземпляр регистратора } logger = logging.getLogger(__name__) def hello_reader(request):    logger.warning('Homepage was accessed at '+str(datetime.datetime.now())+' hours!')    return HttpResponse("

Hello FreeCodeCamp.org Reader :)

") Добавьте в проект  urls.py следующий код для того, чтобы, когда мы получали доступ к домашней странице, вызывалась правильная функция.   from django.contrib import admin from django.urls import path from logging_example import views urlpatterns = [    path('admin/', admin.site.urls),    path('',views.hello_reader, name="hello_reader") ] Время для тестирования И наконец, наша несложная настройка завершена. Все, что нам теперь нужно сделать, это запустить наш сервер и проверить наш журнал. Запустить сервер разработки можно с помощью следующей команды: python manage.py runserver А теперь перейдите на свою домашнюю страницу  127.0.0.1:8000 , где вы увидите сообщение, появление которого мы запрограммировали. После чего проверьте файл  warning.log , расположенный по созданному нами пути. Вот так будет выглядеть результат: Homepage was accessed at 2021-08-29 22:38:29.922510 hours! Homepage was accessed at 2021-08-29 22:48:35.088296 hours! Вот и все! Теперь вы знаете, как вести журнал в Django.
img
Ядро - это центральный компонент операционной системы. Ядро также считается сердцем операционной системы. Он отвечает за управление всеми процессами, памятью, файлами и т. д. Ядро функционирует на самом низком уровне операционной системы. Он действует как интерфейс (мост) между пользовательским приложением (программным обеспечением) и аппаратным обеспечением. Поэтому связь между программным обеспечением и аппаратным обеспечением осуществляется через ядро. Основные функции, которые выполняет ядро: управление процессами управление памятью управление устройством обработка прерываний операции ввода/вывода Теперь давайте разберемся подробнее в этих функциях ядра... Функции ядра в операционной системе Управление процессами Создание, выполнение и завершение процессов выполняются внутри системы всякий раз, когда система находится во включенном состоянии (режиме ON). Процесс содержит всю информацию о задаче, которую необходимо выполнить. Таким образом, для выполнения любой задачи внутри системы создается процесс. В то же время существует множество процессов, которые находятся в активном состоянии внутри системы. Управление всеми этими процессами очень важно для предупреждения тупиковых ситуаций и для правильного функционирования системы, и оно осуществляется ядром. Управление памятью Всякий раз, когда процесс создается и выполняется, он занимает память, и когда он завершается, память должна быть освобождена и может быть использована снова. Но память должна быть обработана кем-то, чтобы освобожденная память могла быть снова назначена новым процессам. Эта задача также выполняется ядром. Ядро отслеживает, какая часть памяти в данный момент выделена и какая часть доступна для выделения другим процессам. Управление устройствами Ядро также управляет всеми различными устройствами, подключенными к системе, такими как устройства ввода и вывода и т. д. Обработка прерываний При выполнении процессов возникают условия, при которых сначала необходимо решить задачи с большим приоритетом. В этих случаях ядро должно прерывать выполнение текущего процесса и обрабатывать задачи с большим приоритетом, которые были получены в промежутке. Операции ввода/вывода Поскольку ядро управляет всеми подключенными к нему устройствами, оно также отвечает за обработку всех видов входных и выходных данных, которыми обмениваются эти устройства. Таким образом, вся информация, которую система получает от пользователя, и все выходные данные, которые пользователь получает через различные приложения, обрабатываются ядром. Типы ядер в операционной системе Как выше было сказано ядро - это программа, которая является основным компонентом операционной системы. Теперь давайте рассмотрим типы ядер. Ядро подразделяется на два основных типа: монолитное ядро Микро-Ядра Существует еще один тип ядра, который является комбинацией этих двух типов ядер и известен как гибридное ядро. Рассмотрим каждый из них вкратце... Монолитное Ядро В этом типе архитектуры ядра все функции, такие как управление процессами, управление памятью, обработка прерываний и т. д. выполняются в пространстве ядра.Монолитные ядра сначала состояли только из одного модуля, и этот модуль отвечал за все функции, которые выполнялись ядром. Это увеличило производительность ОС, так как все функции присутствовали внутри одного модуля, но это также привело к серьезным недостаткам, таким как большой размер ядра, очень низкая надежность, потому что даже если одна функция ядра отказала, это привело к отказу всей программы ядра и плохому обслуживанию, по той же причине. Таким образом, для повышения производительности системы был применен модульный подход в монолитных ядрах, в которых каждая функция присутствовала в отдельном модуле внутри пространства ядра. Таким образом, для исправления любых ошибок или в случае сбоя, только этот конкретный модуль был выгружен и загружен после исправления. Микроядра В этом типе архитектуры ядра основные пользовательские службы, такие как управление драйверами устройств, управление стеком протоколов, управление файловой системой и управление графикой, присутствуют в пространстве пользователя, а остальные функции управление памятью, управление процессами присутствует внутри пространства ядра. Таким образом, всякий раз, когда система имеет потребность в услугах, присутствующих в пространстве ядра, ОС переключается в режим ядра, а для служб пользовательского уровня она переключается в режим пользователя. Этот тип архитектуры ядра уменьшает размер ядра, но скорость выполнения процессов и предоставления других услуг значительно ниже, чем у монолитных ядер. Гибридное Ядро Для наилучшей производительности системы нам требуется как высокая скорость, так и малый размер ядра, чтобы наша система могла иметь максимальную эффективность. Поэтому для решения этой задачи был разработан новый тип ядра, который представлял собой комбинацию монолитного ядра и микроядра. Этот тип ядра известен как гибридное ядро. Такой тип архитектуры используется практически во всех системах, которые производятся в настоящее время.
img
Что такое AppSec? Полное название — Application Security, или безопасность приложений. Его цель — сделать так, чтобы ваши программы были в безопасности, и все жили не зная проблем. Дело в том, что при разработке приложений действительно сложно уследить за всем. Разработчики в основном заняты тем, чтобы реализовать весь заявленный функционал и желательно без костылей. При огромной занятости и монотонности работы можно легко пропустить несколько уязвимостей, что конечно же плохо для всех, за исключением злоумышленников. Тут-то и нужен AppSec, который поможет подробнее разобраться в том, что угрожает приложению, а также предложить решения. Почему AppSec так важен? Сегодня приложения — это не просто программы, это наша жизнь. Банкинг, соцсети, работа — всё крутится вокруг приложений. А где ценная информация — там всегда найдутся те, кто захочет её украсть. По данным различных исследований, более 80% кибератак направлены именно на приложения. Игнорировать безопасность в этом случае почти так же ужасно, как и взламывать. Поэтому AppSec — это не роскошь, а необходимость. Раньше безопасность приложений была чем-то вроде «подумаем об этом потом». Код писали, запускали, а потом уже искали уязвимости (и часто находили их слишком поздно). К счастью, времена меняются. Сейчас мы говорим о подходе Shift Left — переносе безопасности на ранние этапы разработки. Вместо того чтобы чинить код после запуска, разработчики учатся писать безопасный код с самого начала. Добавить сюда автоматизированные инструменты анализа кода (SAST/DAST) и практики DevSecOps — и мы получили современный AppSec. Безопасность здесь встроена в процесс разработки, а не приклеена скотчем в конце. AppSec — это не только про защиту кода, но и про то, чтобы спать спокойно, зная, что приложение не станет звездой новостей из-за утечки данных. Разберемся же подробнее. Ключевые принципы AppSec  AppSec строится на нескольких базовых принципах, которые помогают защитить приложения от угроз. Начнем с классики — CIA-триады: конфиденциальность, целостность и доступность. Конфиденциальность (Confidentiality) — это про то, чтобы данные оставались секретными. Например, если API ключ хранится в открытом доступе в репозитории GitHub — можно поздравить с проваленной миссией. Целостность (Integrity) гарантирует, что данные не будут изменены кем-то посторонним. Будет несколько неприятненько, если кто-то поменяет сумму перевода в банковском приложении с «1000 рублей» на «1 миллион рублей». Грустно и не вкусно. А доступность (Availability) — это чтобы приложение работало всегда, когда нужно. DDoS-атака, которая кладет сервер, — это как раз то, что мешает доступности. Далее поговорим про принцип минимизации привилегий (Least Privilege). Суть проста: никто не должен иметь больше прав, чем ему нужно для работы. Например, если приложению нужно только читать данные из базы, зачем давать ему права на удаление или редактирование? Так же как и зачем стажеру ключи от сейфа с зарплатами всей компании — вроде бы не нужно, но вдруг пригодится… Нет, тут слова «на всякий случай» могут быть слишком губительными. Чем меньше прав, тем меньше шансов на катастрофу. Теперь о современном подходе — Shift Left Security . Раньше безопасность была чем-то вроде «финального босса», которого встречали уже на этапе тестирования или даже после релиза. Сегодня мы переносим проверку безопасности на ранние этапы разработки. Это значит: пишешь код — сразу думаешь о том, как он может быть уязвим. Например, добавляешь обработку пользовательского ввода — сразу проверяешь его на SQL-инъекции. Такой подход экономит кучу времени и нервов, ведь исправить баг на этапе разработки гораздо проще и дешевле, чем устранять последствия взлома. И, конечно же, нельзя забывать про автоматизацию процессов безопасности. Люди склонны ошибаться, особенно когда работают быстро. Но машины — другое дело! Они не устают и не требуют кофейка (пока что).  Инструменты вроде SAST (статический анализ кода) или DAST (динамическое тестирование) помогают находить уязвимости до того, как они станут проблемой. Автоматизация — это как робот-пылесос: можно самим подметать каждый уголок, но зачем, если есть инструмент, который сделает это быстрее и эффективнее? (Если это, конечно, хороший пылесос). В итоге AppSec — это про то, чтобы строить надежные приложения прям с утра, как завещают все успешные люди. Защищать данные, ограничивать доступ, думать о безопасности с самого начала и доверять рутину автоматическим инструментам. Ведь лучше потратить время на защиту сейчас, чем потом разбираться с последствиями утечки данных или взлома. Так, а что угрожает-то нам? Пойдём покажу. Типовые уязвимости в приложениях Когда речь заходит об уязвимостях, разработчики часто представляют себе хакера в капюшоне, который магически взламывает их приложение. На деле всё гораздо прозаичнее: большинство атак используют давно известные дыры, которые можно было бы легко закрыть. Так, для начала, OWASP Top 10 — это список самых распространённых и критичных уязвимостей в веб-приложениях, составленный сообществом экспертов по безопасности. Он помогает разработчикам понять, где чаще всего допускаются ошибки, и как их исправить. Это как шпаргалка по основам безопасности, чтобы приложение не превратилось в проходной двор для хакеров. Разберём несколько популярных уязвимостей из OWASP Top 10 и посмотрим, как их избежать. SQL-инъекции — это когда злоумышленник «подмешивает» вредоносный SQL-код в ваш запрос к базе данных. Например, если код вашей базы данных выглядит так: SELECT * FROM users WHERE username = ' + userInput, а пользователь введёт admin' OR '1'='1, то запрос превратится в: SELECT * FROM users WHERE username = 'admin' OR '1'='1' — и вуаля, хакер получает доступ ко всем данным. Легко? Да, от того и опасно. Решение? Использование параметризованные запросы (prepared statements) или ORM, которые автоматически защищают от таких атак. И все, даже костыли искать не нужно. Межсайтовый скриптинг (XSS) — это атака, при которой злоумышленник внедряет вредоносный код на JavaScript в сайт. Например, пользователь вводит в комментарий, и этот скрипт выполняется у других пользователей. Итог — украденные cookies или другие неприятности. Чтобы этого избежать, всегда нужно сканировать пользовательский ввод и использовать Content Security Policy (CSP), чтобы ограничить выполнение неподписанных скриптов. Уязвимости аутентификации и управления сессиями появляются, если вы неправильно реализовать вход в систему или хранение сессий. Например, если идёт передача сессионного идентификатора через URL (?sessionId=123), его легко украсть. Или же всеми любимые слабые пароли. Решение? Используем безопасные библиотеки для аутентификации (например, OAuth2), защищаем сессии через HTTPOnly и Secure cookies и обязательно внедряем двухфакторную аутентификацию (2FA). Неправильная настройка безопасности — это когда приложение или сервер настроены так, что сами просят их взломать. Например, оставленные включёнными режимы отладки (debug mode), использование устаревших библиотек или открытые директории вроде /admin. Чтобы избежать этого, регулярно обновляем ПО, отключаем всё ненужное и проводим аудит конфигурации. А ещё не забываем про файлы вроде .env — их точно не должно быть в публичных репозиториях! Все эти уязвимости возникают по одной простой причине: разработчики торопятся и забывают про безопасность. И раз уж мы затронули некоторые способы обеспечения безопасности, поговорим подробнее. Методы защиты приложений 1. Использование безопасных фреймворков и библиотек  Почему изобретать велосипед, если есть готовые решения? Всегда важно использовать проверенные временем фреймворки и библиотеки, которые уже учитывают основные аспекты безопасности. Например, Django для Python имеет встроенную защиту от SQL-инъекций и XSS, а Spring Security для Java позволяет легко настроить аутентификацию и авторизацию. Однако обновлять эти инструменты, тоже очень важно и нужно! 2. Практики безопасного кодирования  «Чистый код — это хорошо, но безопасный код — ещё лучше». Например, стоит проверять ввод данных: вместо SELECT * FROM users WHERE id = ' + userInput (на Python или PHP) используй подготовленные запросы. Например, в Python с библиотекой sqlite3 это будет выглядеть так:    cursor.execute("SELECT * FROM users WHERE id = ?", (userInput,))   Не стоит хранить пароли в виде текста: используй хэширование с солью. Например, в Java с библиотекой BCrypt:     String hashedPassword = BCrypt.hashpw(password, BCrypt.gensalt());   Не делаем «быстро и грязно»: оставлять комментарии вроде // TODO: исправить перед релизом — путь к приключениям. 3. Инструменты для автоматизированного анализа кода  Автоматизация — лучший друг разработчика. Инструменты SAST (Static Application Security Testing), такие как SonarQube или Checkmarx, анализируют код на стадии разработки и помогают найти уязвимости вроде утечек данных или небезопасных конфигураций. DAST (Dynamic Application Security Testing), например OWASP ZAP или Burp Suite, проверяет приложение в действии, находя проблемы, которые появляются только при выполнении кода. А IAST (Interactive Application Security Testing) комбинирует оба подхода, чтобы искать уязвимости во время выполнения приложения. Это как иметь личного охранника, который следит за тобой на всех этапах разработки (но только чтобы помочь).  Итак, как мы сегодня разобрались, AppSec (Application Security) — это процесс защиты приложений на всех этапах их жизненного цикла: от разработки до эксплуатации. Основные принципы AppSec включают безопасное кодирование, использование проверенных инструментов и библиотек, регулярное тестирование на уязвимости (SAST, DAST, IAST), а также обучение команды принципам кибербезопасности. Ведь безопасность — это непрерывный процесс, который требует внимания, обновлений и желания нас всех не стать жертвами хакеров.
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59