2.3.2 Обязательное предотвращение жёсткого кодирования чувствительных настроек:
1.1.1 Обязательная проверка данных по типу:
# Пример Cerberus
v = Validator({'name': {'type': 'string'}})
v.validate({'name': 'john doe'})
# Пример jsonschema
schema = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
},
}
validate(instance={"name" : "Eggs", "price" : 34.99}, schema=schema)
1.2.1 Обязательное использование параметризованных запросов:
# Неправильный пример
import mysql.connector
mydb = mysql.connector.connect(
... ...
)
cur = mydb.cursor()
userid = get_id_from_user()
# Использование% для непосредственного форматирования строки и объединения SQL-запроса
cur.execute("SELECT `id`, `password` FROM `auth_user` WHERE `id`=%s " % (userid,))
myresult = cur.fetchall()
# Безопасный пример
import mysql.connector
mydb = mysql.connector.connect(
... ...
)
cur = mydb.cursor()
userid = get_id_from_user()
# Передача кортежа в качестве параметра
cur.execute("SELECT `id`, `password` FROM `auth_user` WHERE `id`=%s " , (userid,))
myresult = cur.fetchall()
# Установка sqlalchemy и инициализация соединения с базой данных
# pip install sqlalchemy
from sqlalchemy import create_engine
# Инициализация подключения к базе данных, изменение на ваше имя пользователя и пароль базы данных
engine = create_engine('mysql+mysqlconnector://user:password@host:port/DATABASE')
# Ссылка на типы данных
from sqlalchemy import Column, String, Integer, Float
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
# Определение объекта Player:
class Player(Base):
# Имя таблицы:
__tablename__ = 'player'
# Структура таблицы:
player_id = Column(Integer, primary_key=True, autoincrement=True)
team_id = Column(Integer)
player_name = Column(String(255))
height = Column(Float(3, 2))
# Вставка, удаление, обновление и запрос
from sqlalchemy.orm import sessionmaker
# Создание типа DBSession:
DBSession = sessionmaker(bind=engine)
# Создание объекта сеанса:
session = DBSession()
# Добавление:
new_player = Player(team_id=101, player_name="Tom", height=1.98)
session.add(new_player)
# Удаление:
row = session.query(Player).filter(Player.player_name=="Tom").first()
session.delete(row)
# Обновление:
row = session.query(Player).filter(Player.player_name=="Tom").first()
row.height = 1.99
# Запрос:
rows = session.query(Player).filter(Player.height >= 1.88).all()
# Сохранение в базу данных:
session.commit()
# Закрытие сеанса:
session.close()
1.2.2 Обязательная фильтрация параметров:
def sql_filter(sql, max_length=20):
dirty_stuff = ["\"", "\\", "/", "*", "'", "=", "-", "#", ";", "<", ">", "+",
"&", "$", "(", ")", "%", "@", ","]
for stuff in dirty_stuff:
sql = sql.replace(stuff, "x")
return sql[:max_length]
1.3.1 Рекомендуется избегать прямого вызова функций для выполнения системных команд:
1.3.2 Обязательно фильтровать символы, передаваемые в функции выполнения команд:
import os
import sys
import shlex
domain = sys.argv[1]
# Замена символов, которые можно использовать для внедрения команд, на пробелы
badchars = "\n&;|'\"$()`-"
for char in badchars:
domain = domain.replace(char, " ")
result = os.system("nslookup " + shlex.quote(domain))
1.3.3 Обязательно запрещать небезопасный код выполнения:
1.4.1 Обязательно ограничение типов файлов:
import os
ALLOWED_EXTENSIONS = ['txt','jpg','png']
def allowed_file(filename):
if ('.' in filename and
'..' not in filename and
os.path.splitext(filename)[1].lower() in ALLOWED_EXTENSIONS):
return filename
return None
1.4.2 Обязательно запретить хранение внешних файлов в каталоге исполняемых файлов:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )