DmitrMakeev commited on
Commit
529f9a3
·
verified ·
1 Parent(s): 969143d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -3
app.py CHANGED
@@ -1022,6 +1022,25 @@ def get_order_monitop():
1022
 
1023
 
1024
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1025
 
1026
  # Чтение ордера по ключу и ВК ИД для приложения
1027
  @app.route('/get_order', methods=['POST'])
@@ -1037,12 +1056,23 @@ def get_order():
1037
 
1038
  logging.debug(f"Received data: vk_id={vkid}, order={order}, apps_id={apps_id}, fullUrl={fullUrl}")
1039
 
 
 
 
 
 
 
 
 
1040
  # Парсим полный URL для получения параметров запроса
1041
- parsed_url = urlparse(fullUrl)
1042
- logging.debug(f"Parsed URL: {parsed_url}")
1043
- query_params = dict(parse_qsl(parsed_url.query, keep_blank_values=True))
1044
  logging.debug(f"Query params for signature check: {query_params}")
1045
 
 
 
 
 
 
1046
  # Подключаемся к базе данных
1047
  conn = sqlite3.connect(DATABASE_NEW)
1048
  cursor = conn.cursor()
 
1022
 
1023
 
1024
 
1025
+
1026
+ # Функция для валидации подписи ВК приложения
1027
+ def is_valid(*, query: dict, secret: str) -> bool:
1028
+ """Check VK Apps signature"""
1029
+ # Отфильтровываем параметры, начинающиеся с "vk_"
1030
+ vk_subset = OrderedDict(sorted((k, v) for k, v in query.items() if k.startswith("vk_")))
1031
+ logging.debug(f"Filtered VK params: {vk_subset}")
1032
+
1033
+ # Объединяем параметры в строку
1034
+ encoded_params = urlencode(vk_subset, doseq=True)
1035
+ logging.debug(f"Encoded params: {encoded_params}")
1036
+
1037
+ # Вычисляем хеш-код с использованием HMAC и SHA256
1038
+ hash_code = b64encode(HMAC(secret.encode(), encoded_params.encode(), sha256).digest())
1039
+ decoded_hash_code = hash_code.decode('utf-8')[:-1].replace('+', '-').replace('/', '_')
1040
+ logging.debug(f"Calculated signature: {decoded_hash_code}")
1041
+
1042
+ # Сравниваем с переданной подписью
1043
+ return query.get("sign") == decoded_hash_code
1044
 
1045
  # Чтение ордера по ключу и ВК ИД для приложения
1046
  @app.route('/get_order', methods=['POST'])
 
1056
 
1057
  logging.debug(f"Received data: vk_id={vkid}, order={order}, apps_id={apps_id}, fullUrl={fullUrl}")
1058
 
1059
+ # Проверка подписи для приложения
1060
+ if str(apps_id) not in api_key_apps_vk: # Приводим apps_id к строке
1061
+ logging.error("Invalid apps_id")
1062
+ return json.dumps({"error": "Invalid apps_id"}), 400
1063
+
1064
+ secret = api_key_apps_vk[str(apps_id)] # Приводим apps_id к строке
1065
+ logging.debug(f"Using secret: {secret}")
1066
+
1067
  # Парсим полный URL для получения параметров запроса
1068
+ query_params = dict(parse_qsl(urlparse(fullUrl).query, keep_blank_values=True))
 
 
1069
  logging.debug(f"Query params for signature check: {query_params}")
1070
 
1071
+ # Проверяем подпись
1072
+ if not is_valid(query=query_params, secret=secret):
1073
+ logging.error("Invalid signature")
1074
+ return json.dumps({"error": "Invalid signature"}), 400
1075
+
1076
  # Подключаемся к базе данных
1077
  conn = sqlite3.connect(DATABASE_NEW)
1078
  cursor = conn.cursor()