Архив метки: Python

Автоматическое тестирование конфигурации Nginx

Нашел любопытную утилиту для тестирования конфигурации nginx — https://github.com/yandex/gixy. Написана на python, ставится очень быстро через pip. Пример для centos 8:

# dnf install python3-pip

# pip3 install gixy

# gixy /etc/nginx/nginx.conf

 

И дальше смотрите рекомендации. Я протестировал на nginx, который работает в качестве proxy и получил рекомендацию, заменить

 

proxy_set_header Host $http_host;

 

на

 

proxy_set_header Host $host;

 

И тут же ссылка на описание, почему так стоит сделать. В общем, рекомендую, особенно если на потоке много работаете с nginx. Надо будет все свои шаблоны конфигураций проверить этой штукой.

Как использовать модуль PYTZ в Python

Значения даты и времени зависят от зоны. Эти значения необходимо изменить для тех приложений Python, которые требуют работы с международными пользователями. Согласно зоне, модуль dateTime Python не может преобразовывать значения даты и времени. Эту проблему можно решить, используя модуль pytz Python. Этот модуль не установлен в Python. Итак, вам необходимо установить этот модуль, прежде чем использовать его в скрипте. В этой статье показано, как модуль pyzt можно установить и использовать в Python.

 

Установите модуль PYZT:

Выполните следующую команду, чтобы установить модуль pyzt, прежде чем практиковаться в примерах этой статьи.

$ pip install pytz

Пример 1: Распечатать все поддерживаемые и часто используемые часовые пояса

Следующий скрипт распечатает все поддерживаемые часовые пояса и широко используемые часовые пояса с помощью модуля pyzy . Модуль pyzt импортируется в начале скрипта. Атрибут pytz.all_timezones возвращает список всех поддерживаемых часовых поясов в виде объекта списка. Атрибут pytz.common_timezones возвращает список всех часто используемых часовых поясов в виде объекта списка. После выполнения этого скрипта будут напечатаны два списка.

# Импортировать модуль pytz

import pytz 



# Распечатать все поддерживаемые часовые пояса

print('Часовые пояса, поддерживаемые модулем pytz: n', pytz.All_timezones, 'n ')



# Распечатать часто используемые часовые пояса

print('Обычно используемые часовые пояса: n', pytz.common_timezones, 'n ')

 

Пример 2: напечатать названия стран

Следующий скрипт распечатает список названий стран с кодами стран и название страны с конкретным кодом страны. Метод pytz.country_names.items() возвращает объект словаря названий стран с кодом страны. Коды стран назначаются в ключах объекта словаря, а названия стран назначаются в значениях объекта словаря. Цикл for используется в сценарии для печати названий стран с кодом страны в каждой строке путем повторения объекта словаря, возвращаемого функцией pytz.country_names.items(). Затем будет напечатано название страны с кодом страны «RU».

# Импортировать модуль pytz

import pytz

'' '

Вывести название страны с кодом страны в каждой строке,

используя цикл for

' ''

print('country_names:')

for key, val in pytz.country_names.items():

print(val, '(', key, ')')



# Распечатать название страны с конкретным кодом страны

print('n Название страны на основе кода страны (RU):', pytz.country_names ['RU'])


 

Пример-3: Распечатать дату и время в зависимости от часового пояса

Значения даты и времени зависят от часового пояса. Следующий скрипт сначала напечатает дату и время текущего часового пояса. Затем часовой пояс будет изменен на US/Eastern с помощью метода pytz.timezone(), а дата и время будут напечатаны на основе US/Eastern часового пояса. Затем часовой пояс будет изменен на часовой пояс Europe/Moscow, а дата и время будут напечатаны в соответствии с часовым поясом Europe/Moscow. Дата и время часовых поясов UTC и IST будут напечатаны позже.

# Импортировать модуль datetime

import datetime as dt



# Импортировать модуль pyzt

import pytz



# Получить текущую дату

source_date = dt.datetime.now()



# Распечатать текущие данные и время

print('Текущая дата и время: n', source_date)



# Установить часовой пояс на US/Eastern

currentTimeZone = pytz.timezone('US/Eastern')



# Вывести текущий часовой пояс Europe/Moscow

print('nЧасовой пояс установлен на: n', currentTimeZone)



# Прочитать и распечатать текущую дату и время часового пояса

currentDateWithTimeZone = currentTimeZone.localize(source_date)

print('Дата и время этого часового пояса: n', currentDateWithTimeZone)



# Установите целевой часовой пояс

newTimeZone = pytz.timezone('Europe/Moscow')

print('n Часовой пояс установлен на: n',newTimeZone)



# Прочитать и распечатать текущую дату и время нового часового пояса

newDateWithTimezone = currentDateWithTimeZone.astimezone(newTimeZone)

print('Дата и время этого часового пояса: n', newDateWithTimezone)



# Прочитать дату и время указанного часового пояса

print('n Datetime of UTC Time-zone:', dt.datetime.now(tz = currentTimeZone))

print('Datetime часового пояса IST:', dt.datetime.now(tz = newTimeZone))




 

Пример-4: Распечатать отформатированные дату и время

В предыдущих примерах значения даты и времени печатаются в формате по умолчанию. Следующий скрипт распечатает отформатированные данные и время в соответствии с выбранным часовым поясом. Формат даты и времени определен в начале скрипта. В соответствии с форматом дата будет напечатана в формате дд-мм-гггг, а время будет напечатано в формате чч: мм: сс. Затем часовой пояс будет назначен Europe/Moscow, а дата и время будут напечатаны с использованием функции strftime() в указанном выше формате. Затем часовой пояс будет присвоен Азии/Дакке и напечатан, как и раньше.

# Импортировать модуль DateTime

from datetime import datetime



# Импортировать модуль часового пояса

from pytz import timezone



# Установить формат даты и времени

dt_format = "%d-%m-%Y %H:%M:%S"



# Установить текущее время в зоне Europe/Moscow

moscowZone = datetime.now(timezone('Europe/Moscow'))

print('Дата и время зоны Moscow: n', moscowZone.strftime(dt_format))



# Измените часовой пояс на Asia/Dhaka

dhakaZone = moscowZone.astimezone(timezone('Asia/Dhaka'))

print('Дата и время зоны Дакки: n', dhakaZone.strftime(dt_format))




 

Заключение:

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



2021-04-10T13:04:12
Python

Как получить доступ к SQLite из Python

Python — это популярный и надежный язык программирования, богатый функциями, которые делают его пригодным для использования в широком спектре случаев, таких как анализ данных, создание сетей, автоматизация ИТ, тестирование на проникновение и многие другие. Он также имеет простой синтаксис, который позволяет разработчикам, знающим другие языки программирования, легко адаптироваться к использованию Python.

Данные повсюду, и широкий спектр программных приложений взаимодействует с данными с помощью системы управления базами данных. SQLite — одна из самых популярных систем управления базами данных в Python.

SQLite — это простой, мощный механизм реляционной базы данных с открытым исходным кодом, который поддерживает большие программные приложения и встроенные системы. SQLite является автономным и требует минимальной настройки, что упрощает настройку и запуск с минимальными затратами времени. По умолчанию в Python встроен модуль SQLite(sqlite3), очень интуитивно понятный модуль для работы с базами данных SQLite в Python.

В этой статье мы рассмотрим, как использовать Python для работы с базами данных SQLite. От установления соединения до создания баз данных, чтения баз данных, обновления и удаления баз данных.

Начнем с установки SQLite:

 

Установка SQLite и Python

В зависимости от вашего дистрибутива Linux вы можете загрузить архив SQLite с https://www.sqlite.org/download.html или использовать диспетчер пакетов.

Чтобы установить его в Debian:

sudo apt-get update



sudo apt-get install sqlite -y

Затем у вас должна быть установлена ​​последняя версия Python3. По умолчанию Python должен быть предварительно установлен в вашем дистрибутиве.

 

Оболочка SQLite

Методом по умолчанию для взаимодействия с базами данных SQLite является использование оболочки. Оболочка позволяет выполнять встроенные команды SQL или набор для выполнения функций в базах данных.

Для запуска оболочки SQLite используйте команду:

$ sqlite

SQLite версии 2.8.17 Введите «.help» для получения инструкций.

sqlite >

Это должно запустить оболочку SQLite с подсказкой, позволяющей вводить команды. Начните с ввода команды .help, чтобы просмотреть справку оболочки.

sqlite> .help

.databases             List names and files of attached databases

.dump ?TABLE? ...      Dump the database in a text format

.echo ON|OFF           Turn command echo on or off

.exit                  Exit this program

.explain ON|OFF        Turn output mode suitable for EXPLAIN on or off.

.header(s) ON|OFF      Turn display of headers on or off

.help                  Show this message

.indices TABLE         Show names of all indices on TABLE

.mode MODE             Set mode to one of "line(s)", "column(s)",

"insert", "list", or "html"



----------------------------------------------------------------------

Для выхода из оболочки SQLite используйте команду .quit.

sqlite > .quit

Внутри оболочки SQLite можно использовать и другие функции и операции. Например, чтобы просмотреть все базы данных, вы можете использовать команду database.

Мы настоятельно рекомендуем вам поэкспериментировать с оболочкой SQLite и ознакомиться с ней, поскольку она позволит вам понять, как использовать модуль SQLite3 в Python.

 

Подключение к базе данных

Давайте теперь будем использовать модули Python и SQLite3 для взаимодействия с базами данных SQLite. Стоит отметить, что есть и другие модули Python, которые вы можете использовать для взаимодействия с SQLite. Однако SQLite3 прост и поставляется в комплекте с Python.

Рассмотрим приведенный ниже сценарий для подключения к базе данных SQLite.

import sqlite3 from sqlite3 import Error



def connect_db(db_path):

connection = None     try:

connection = sqlite3.connect(db_path)

print("База данных успешно подключена")

except Error as e:

print(f"Произошла ошибка: {e}")

return connection



connect_db("/home/user/Desktop/demo.sqlite")

Начнем с импорта модулей SQLite и Error.

В строке 3 мы создаем функцию connect_db(), которая принимает в качестве аргумента путь к базе данных.

Следующая часть включает блок попытки/ошибки. Первая часть принимает в качестве аргумента путь к базе данных и устанавливает соединение. Обратите внимание: в SQLite, если указанная база данных не существует, она создается автоматически.

Блок ошибок пытается перехватить исключения и распечатать их пользователю.

В последней строке мы вызываем функцию connect_db и передаем путь к базе данных, которую хотим использовать или создать.

Примечание
Если вы хотите создать базу данных памяти вместо диска, вы можете указать: memory в объекте подключения.

sqlite3.connect(“:memory”)

SQLite создать таблицу

В SQLite мы можем использовать оболочку SQL для создания таблиц с помощью запроса CREATE TABLE. Общий синтаксис такой:

CREATE TABLE database_name.table_name (

column_name datatype PRIMARY KEY(column(s),

column2_name datatype,

…         columnN_name datatype,

);

Мы не будем углубляться в создание таблиц с использованием оболочки SQLite, поскольку наша основная задача — Python. Чтобы узнать больше, ознакомьтесь с документацией по SQL из приведенного ниже ресурса:

https://docs.microsoft.com/en-us/sql/?view=sql-server-ver15

 

Сейчас :

Чтобы использовать модули Python и sqlite3 для создания таблиц базы данных, нам нужно использовать объект курсора и выполнять функции SQL-запросов.

Рассмотрим код ниже:

import sqlite3 from sqlite3 import Error



def connect_db(db_path):

connection = None



try:

connection = sqlite3.connect(db_path)

print("База данных успешно подключена")

except Error as e:

print(f"Произошла ошибка: {e}")

return connection def run_query(connection, sql_query):

cursor = connection.cursor()

try:

cursor.execute(sql_query)

connection.commit()

print("SQL - Запрос успешно выполнился………………[OK]")

except Error as e:

print(f" Ошибка запроса……{e}")

query = """

CREATE TABLE IF NOT EXISTS users (

id INTEGER PRIMARY KEY AUTOINCREMENT,

name TEXT NOT NULL,

year INTGER,

genre TEXT,

country TEXT

);

"""



run_query(connection=connect_db("/home/user/Desktop/sql.sqlite"), sql_query=query)






Давайте теперь обсудим, что делает приведенный выше код — найдите первую функцию, описанную выше (см.).

Во второй функции create мы передаем соединение и запрос для выполнения в качестве параметров.

Следующие строки создают объект курсора, который мы будем использовать для вызова метода execute.

Как упоминалось выше, следующие строки вызывают объект курсора для выполнения метода и вызывают передачу запроса в качестве параметра. Блок также выводит сообщение об успешном выполнении запроса.

После успешного выполнения запроса мы говорим SQLite использовать метод фиксации для сохранения изменений в базе данных.

Блок except перехватывает исключения и выводит пользователю сообщение об ошибке.

Наконец, мы создаем запрос для выполнения с использованием простого синтаксиса SQLite.

 

Вставка записей в SQLite

Чтобы добавить данные в базу данных SQLite, мы можем погрузиться в функцию run_query(), которую мы использовали для создания, поскольку она может выполнять любой запрос SQLite, который мы ей передаем. Однако мы используем запрос INSERT INTO для добавления данных в таблицу.

Рассмотрим блок ниже:

add_users = """

INSERT INTO

users (id, name, year, genre, country)

VALUES

("101", "AndreyEx", "2021", "IT", "Russia"),

("201", "Destroyer", "2017", "IT", "Russia"),

("301", "Annihilator", "2016", "IT", "Russia");

""" run_query(connection=connect_db("/home/user/Desktop/sql.sqlite"), sql_query=add_users)

Теперь нам нужно вызвать функцию run_query и добавить передачу запроса add_users для вставки данных в таблицу users. Убедитесь, что таблица, в которую вы вставляете данные, существует, чтобы избежать ошибки.

 

SQLite Удалить записи

Вы также можете использовать функцию run_query() для удаления записей из указанной таблицы. Все, что вам нужно, это установить запрос как DELETE FROM.

Рассмотрим следующий подзапрос:

remove = "DELETE FROM users WHERE name = 'AndreyEx'" run_query(connection=connect_db("/home/user/Deskop/sql.sqlite"), sql_query=remove)

Вышеупомянутый запрос удаляет «AndreyEx» из таблицы users.

 

Заключение

В этой статье вы научились использовать Python для доступа к базам данных SQLite и взаимодействия с ними.

Из того, что вы узнали из этой статьи, теперь вы можете создавать функции, подключаться к базам данных SQLite, создавать таблицы, вставлять данные и удалять их. Хотя это руководство для начинающих по работе с SQLite в Python, оно должно помочь вам начать изучение других технологий, таких как SQLAlchemy и т. д.



2021-04-08T13:10:40
Python

Как использовать функцию enumerate в Python для создания циклов со счетчиками

В этой статье будет объяснено использование функции «enumerate», доступной в стандартной библиотеке модулей Python. Функция Enumerate позволяет вам присваивать «index» или «count» элементам в любом итерируемом объекте. Затем вы можете реализовать для них дополнительную логику, поскольку у вас будет доступ как к значениям, так и к сопоставленному с ними счетчику. Читать

Как работать с CSV-файлами в Python

В этой статье будет рассмотрено руководство по работе с файлами «csv» с помощью Python. Термин «csv» означает «значения, разделенные запятыми», где каждая строка или строка содержат текстовые значения, разделенные запятыми. В некоторых случаях для разделения значений вместо запятой также используется «точка с запятой». Однако это не имеет большого значения для правил формата файлов, и логика обработки обоих типов разделителей остается той же.

Формат файла CSV обычно используется для обслуживания баз данных и электронных таблиц. Первая строка в CSV-файле чаще всего используется для определения полей столбцов, а все остальные оставшиеся строки считаются строками. Эта структура позволяет пользователям представлять табличные данные с помощью файлов CSV. Файлы CSV можно редактировать в любом текстовом редакторе. Однако такие приложения, как LibreOffice Calc, предоставляют расширенные инструменты редактирования, сортировки и фильтрации.

 

Чтение данных из файлов CSV с помощью Python

Модуль CSV в Python позволяет вам читать, записывать и управлять любыми данными, хранящимися в файлах CSV. Чтобы прочитать файл CSV, вам нужно будет использовать метод «reader» из модуля Python «csv», который включен в стандартную библиотеку Python.

Учтите, что у вас есть файл CSV, содержащий следующие данные:

Mango,Banana,Apple,Orange

50,70,30,90

 

Первая строка файла определяет категорию каждого столбца, в данном случае название фруктов. Во второй строке хранятся значения в каждом столбце (на складе). Все эти значения разделяются запятой. Если бы вы открыли этот файл в приложении для работы с электронными таблицами, таком как LibreOffice Calc, он бы выглядел так:

Как работать с CSV-файлами в Python

 

Теперь, чтобы прочитать значения из файла «fruit.csv» с помощью модуля Python «csv», вам нужно будет использовать метод «reader» в следующем формате:

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file)

for line in data_reader:

print (line)

 

Первая строка в приведенном выше примере импортирует модуль «csv». Затем оператор «with open» используется для безопасного открытия файла, хранящегося на вашем жестком диске (в данном случае «fruit.csv»). Новый объект «data_reader» создается путем вызова метода «reader» из модуля «csv». Этот метод «читателя» принимает имя файла в качестве обязательного аргумента, поэтому ему передается ссылка на «fruit.csv». Затем выполняется оператор цикла for для печати каждой строки из файла «fruit.csv». После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

['50', '70', '30', '90']

 

Если вы хотите назначить номера строк для вывода, вы можете использовать функцию «перечислить», которая присваивает номер каждому элементу в итерации (начиная с 0, если не было изменено).

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file)

for index, line in enumerate(data_reader):

print (index, line)

 

Переменная index хранит счетчик для каждого элемента. После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

0 ['Mango', 'Banana', 'Apple', 'Orange']

1 ['50', '70', '30', '90']

 

Поскольку первая строка в файле «csv» обычно содержит заголовки столбцов, вы можете использовать функцию «перечислить» для извлечения этих заголовков:

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file)

for index, line in enumerate(data_reader):

if index == 0:

headings = line

print (headings)

 

Блок «if» в приведенном выше утверждении проверяет, равен ли индекс нулю (первая строка в файле «fruit.csv»). Если да, то значение переменной «строка» присваивается новой переменной «заголовки». После выполнения приведенного выше примера кода вы должны получить следующий результат:

['Mango', 'Banana', 'Apple', 'Orange']

 

Обратите внимание, что вы можете использовать свой собственный разделитель при вызове метода csv.reader, используя необязательный аргумент «разделитель» в следующем формате:

import csv

with open("fruits.csv") as file:

data_reader = csv.reader(file, delimiter=";")

for line in data_reader:

print (line)

 

Поскольку в файле csv каждый столбец связан со значениями в строке, вы можете создать объект «словарь» Python при чтении данных из файла «csv». Для этого вам нужно использовать метод «DictReader», как показано в приведенном ниже коде:

import csv

with open("fruits.csv") as file:

data_reader = csv.DictReader(file)

for line in data_reader:

print (line)

 

После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

{'Mango': '50', 'Banana': '70', 'Apple': '30', 'Orange': '90'}</cce_text>



So now you have a dictionary object that associates individual columns with their corresponding values in the rows. This works fine if you have only one row. Let's assume that the "fruits.csv" file now includes an additional row that specifies how many days it will take for the stock of fruit to perish.



[cce_text width="100%" height="100%" escaped="true" theme="blackboard" nowrap="0"]Mango,Banana,Apple,Orange

50,70,30,90

3,1,6,4

 



Если у вас несколько строк, выполнение одного и того же примера кода, приведенного выше, приведет к другому результату.

{'Mango': '50', 'Banana': '70', 'Apple': '30', 'Orange': '90'}

{'Mango': '3', 'Banana': '1', 'Apple': '6', 'Orange': '4'}

 

Это может быть не идеально, поскольку вы можете сопоставить все значения, относящиеся к одному столбцу, к одной паре ключ-значение в словаре Python. Вместо этого попробуйте этот пример кода:

import csv

with open("fruits.csv") as file:

data_reader = csv.DictReader(file)

data_dict = {}

for line in data_reader:

for key, value in line.items():

data_dict.setdefault(key, [])

data_dict[key].append(value)

print (data_dict)

 

После выполнения примера кода, упомянутого выше, вы должны получить следующий результат:

{'Mango': ['50', '3'], 'Banana': ['70', '1'], 'Apple': ['30', '6'], 'Orange': ['90', '4']}

 

Цикл «for» используется для каждого элемента объекта «DictReader» для перебора пар ключ-значение. Перед этим определяется новая переменная словаря Python «data_dict». Он будет хранить окончательные сопоставления данных. Во втором блоке цикла for используется метод setdefault словаря Python. Этот метод присваивает значение ключу словаря. Если пара «ключ-значение» не существует, создается новая из указанных аргументов. Таким образом, в этом случае новый пустой список будет назначен ключу, если он еще не существует. Наконец, «значение» добавляется к соответствующему ключу в конечном объекте «data_dict».

 

Запись данных в файл CSV

Чтобы записать данные в файл «csv», вам нужно будет использовать метод «writer» из модуля «csv». В приведенном ниже примере к существующему файлу «fruit.csv» будет добавлена ​​новая строка.

import csv

with open("fruits.csv", "a") as file:

data_writer = csv.writer(file)

data_writer.writerow([3,1,6,4])

 

Первый оператор открывает файл в режиме «добавления», обозначенном аргументом «а». Затем вызывается метод «писателя», и ему передается ссылка на файл «fruit.csv» в качестве аргумента. Метод «writerow» записывает или добавляет новую строку в файл.

Если вы хотите преобразовать словарь Python в файловую структуру «csv» и сохранить вывод в файле «csv», попробуйте этот код:

import csv

with open("fruits.csv", "w") as file:

    headings = ["Mango", "Banana", "Apple", "Orange"]

    data_writer = csv.DictWriter(file, fieldnames=headings)

    data_writer.writeheader()

    data_writer.writerow({"Mango": 50, "Banana": 70, "Apple": 30, "Orange": 90})

    data_writer.writerow({"Mango": 3, "Banana": 1, "Apple": 6, "Orange": 4})

 

После открытия пустого файла «fruit.csv» с помощью оператора «with open» определяется новая переменная «заголовки», которая содержит заголовки столбцов. Новый объект «data_writer» создается путем вызова метода «DictWriter» и передачи ему ссылки на файл «fruit.csv» и аргумент «fieldnames». В следующей строке заголовки столбцов записываются в файл с помощью метода «writeheader». Последние два оператора добавляют новые строки к соответствующим заголовкам, созданным на предыдущем шаге.

 

Заключение

Файлы CSV предоставляют удобный способ записи данных в табличном формате. Встроенный в Python модуль «csv» позволяет легко обрабатывать данные, доступные в файлах «csv», и реализовывать на них дополнительную логику.



2021-04-02T16:38:35
Python

Уязвимости состояния гонки в веб-приложениях

Когда веб-приложению, настроенному для управления функциями в фиксированной последовательности, требуется выполнить две или более операций одновременно, происходит атака состояния гонки. Этот метод использует преимущество временной задержки между введением услуги и началом контроля безопасности. Эта атака может быть осуществлена одним из двух способов, основанных на многопоточных приложениях: вторжение, вызванное ненадежными процессами, и вторжение, вызванное заслуживающим доверия процессом, который может иметь одинаковые и равные права.

Различные процессы могут взаимодействовать друг с другом без адекватных мер. Эти атаки также известны как атака Time of Check, атака Time of Use или атаки TOC/TOU. Уязвимости в условиях гонки возникают в первую очередь из-за базовых программных ошибок, которые обычно создают разработчики, и эти сбои оказались дорогостоящими. Злонамеренные организации использовали расовые условия для множества злонамеренных целей, например, от получения бесплатных ваучеров до кражи денег с онлайн-счетов и инвестиционных фирм.

Предположим, что два параллельных потока выполнения пытаются поднять значение глобальной переменной на 5. В конечном счете, тогда глобальная переменная будет иметь значение 10. Однако если все потоки выполняются одновременно, выполнение может быть неправильным без блокировки ресурсов или синхронизации. Когда первый поток выполняет некоторые манипуляции с этой глобальной переменной, второй поток читает ее и начинает выполнять некоторые другие манипуляции. В этом случае конечное значение будет не таким, как ожидалось.

Это происходит, так как эффект завершения одного потока зависит от результата другого. Когда два потока выполняются одновременно, будут непредвиденные последствия.

 

Объем атак на состояние расы:

Представьте себе, что что-то более важное выполняется двумя потоками из приведенного выше примера, например обмен деньгами между банковскими счетами. Чтобы правильно отправить деньги, программа должна будет выполнить эти задачи в следующей последовательности: проверить, достаточно ли остатка на счете отправителя, добавить деньги на счет получателя, а затем вычесть со счета отправителя. Но если вы одновременно отправляете два запроса, вы можете вызвать условие, при котором последовательность выполнения потока изменится. В подобной ситуации вы получите совсем другую сумму, чем ожидали.

Уязвимость Race condition была обнаружена Егором Хомаковым на сайте Starbucks. Он нашел способ создать бесконечное количество кредитов на подарочные ваучеры Starbucks бесплатно, используя разные браузеры с разными файлами cookie.

Выдающаяся атака Meltdown является примером уязвимости состояния расы. В атаке meltdown слабость вызывается параллельной обработкой извлечения данных из памяти и проверкой подлинности того, разрешен ли пользователю доступ к памяти. Этот недостаток позволяет инструменту избежать стандартных проверок привилегий, которые отделяют механизм атаки от доступа к данным ОС. Эта лазейка позволяет любому несанкционированному процессу просматривать данные и информацию с любого другого адреса, связанного с текущим состоянием прогресса в памяти. В процессе неправильного выполнения информация с неутвержденного адреса часто быстро складывается в кэш центрального процессора, из которого эта информация может быть восстановлена.

 

Реальные сценарии атак:

Постоянно отправляя многочисленные запросы на веб-сервер, вы можете искать и манипулировать условиями гонки в веб-приложениях. Если вы хотите узнать, можете ли вы снять больше денег, чем у вас есть на банковском счете, используя функцию curl, вы можете одновременно отправить несколько запросов на вывод средств на сервер.

curl (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000) & (withdraw 50000)

 

Чем больше требований вы подадите за короткий промежуток времени, тем выше вероятность того, что ваша атака сработает.

Более того, если вы отправляете асинхронные последующие запросы, вы будете следовать за пользователем несколько раз вместо отправки ответа об ошибке, то есть если вы добавите поддельный заголовок, содержащий %s, отбрасывая запросы с помощью turbo intruder, и вставите следующий код python:

def followReqs(target, wordlists):

engine = RequestEngine(endpoint=target.endpoint,

concurrentConnections=40,

requestsPerConnection=100,

pipeline=False

)



for i in range(40):

engine.queue(target.req, str(i), gate='check')



engine.openGate('check')

.complete(timeout=60)

def responseHandle(req, interesting):

table.add(req)

Вы увидите кнопку атаки. После нажатия этой кнопки Turbo Intruder отправляет 40 запросов и сканирует коды состояния. Если вы видите несколько ответов со статусом 201 сгенерированный, это означает, что вы несколько раз следили за этим человеком.

Существует уязвимость race condition, при которой вы можете получить доступ к нескольким консолям, предлагаемым для бесплатных учетных записей. Большинство сайтов, предоставляющих бесплатные консоли, имеют бесплатные учетные записи, стандартные и премиальные пакеты. Бесплатные аккаунты предоставляют только 2 или 3 консоли на одного пользователя. Чтобы нарушить это ограничение и использовать неограниченное количество консолей, вторгнитесь в запрос GET, используя нулевые полезные нагрузки несколько раз, например 100 или 200. А затем удалите любую из консолей вручную из пользовательского интерфейса во время выполнения потоков.

 

Вывод:

В качестве средства подрыва контроля доступа включаются условия гонки. Любая программа, зависящая от механизмов контроля доступа, может оказаться уязвимой. Большую часть времени на сайтах финансовых учреждений хакеры используют расовые условия. Поскольку это может привести к неограниченным финансовым выгодам для хакера, если состояние гонки может быть обнаружено на жизненно важной функции, такой как снятие наличных, денежный перевод или оплата кредитной картой. Платформы электронной коммерции, видеоигры и услуги онлайн-голосования-это другие технологии высокого риска. Реализация безопасного параллелизма-это секрет избежания гоночных условий. И вы также можете использовать блокировки ресурсов. Также будет встроена функция блокировки для языков программирования с возможностями параллелизма, которые помогают предотвратить такие условия. Кроме того, соблюдение стандартов безопасного кодирования, т. е. концепции наименьших привилегий и кода аудита, уменьшит вероятность нарушения программы.



2021-04-01T23:42:08
Python