DmitrMakeev commited on
Commit
c9bf30b
·
verified ·
1 Parent(s): f7afb99

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -21
app.py CHANGED
@@ -1025,32 +1025,35 @@ def get_order_monitop():
1025
 
1026
 
1027
  # Функция для валидации подписи ВКонтакте
1028
- def is_valid(*, query: dict, secret: str) -> bool:
 
1029
  """Проверка подписи ВКонтакте"""
1030
- # Извлекаем параметры из строки запроса
1031
- parsed_url = urlparse(query.get('fullUrl', ''))
1032
  query_params = parse_qs(parsed_url.query)
1033
 
1034
- # Фильтруем только параметры, начинающиеся с 'vk_'
1035
- vk_subset = OrderedDict(sorted(
1036
- (k, v[0]) for k, v in query_params.items() if k.startswith("vk_") and k != "sign"
1037
- ))
1038
-
1039
- # Строка для подписи
1040
- data_to_sign = urlencode(vk_subset, doseq=True)
1041
 
1042
- # Вычисление подписи
1043
- hash_code = b64encode(HMAC(secret.encode(), data_to_sign.encode(), sha256).digest()).decode('utf-8')
1044
 
1045
- # Кодируем подпись в нужном формате
 
 
 
 
1046
  decoded_hash_code = hash_code[:-1].replace('+', '-').replace('/', '_')
1047
 
 
 
 
 
1048
  logging.debug(f"Строка для подписи: {data_to_sign}")
1049
  logging.debug(f"Вычисленная подпись (Base64): {decoded_hash_code}")
1050
- logging.debug(f"Полученная подпись из запроса: {query.get('sign')}")
1051
 
1052
- # Сравниваем подписи
1053
- return query.get("sign") == decoded_hash_code
1054
 
1055
  # Чтение ордера по ключу и ВК ИД для приложения
1056
  @app.route('/get_order', methods=['POST'])
@@ -1059,13 +1062,13 @@ def get_order():
1059
  logging.debug("Начало обработки запроса get_order")
1060
 
1061
  # Чтение параметров из POST-запроса
 
1062
  vkid = request.form.get('vk_id', '')
1063
  order = request.form.get('order', '')
1064
- apps_id = request.form.get('apps_id', '')
1065
- fullUrl = request.form.get('fullUrl', '')
1066
 
1067
  # Логирование параметров запроса
1068
- logging.debug(f"Полученные параметры: vk_id: {vkid}, order: {order}, apps_id: {apps_id}, sign: {sign}")
1069
 
1070
  # Получение ключей приложения
1071
  api_key_apps_vk_dict = json.loads(api_key_apps_vk)
@@ -1077,8 +1080,8 @@ def get_order():
1077
  return jsonify({"error": "Secret key not found for app ID"}), 400
1078
 
1079
  # Проверка подписи
1080
- if not is_valid(query=request.form, secret=secret_key):
1081
- logging.error(f"Неверная подпись для запроса: {request.form}")
1082
  return jsonify({"error": "Invalid signature"}), 400
1083
 
1084
  # Проверка наличия vk_id и order
@@ -1123,6 +1126,34 @@ def get_order():
1123
 
1124
 
1125
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1126
 
1127
 
1128
 
 
1025
 
1026
 
1027
  # Функция для валидации подписи ВКонтакте
1028
+ # Функция для валидации подписи ВКонтакте
1029
+ def is_valid(*, full_url: str, secret: str) -> bool:
1030
  """Проверка подписи ВКонтакте"""
1031
+ # Разбираем URL
1032
+ parsed_url = urlparse(full_url)
1033
  query_params = parse_qs(parsed_url.query)
1034
 
1035
+ # Извлекаем параметры, начинающиеся с "vk_" и исключаем "sign"
1036
+ vk_subset = {k: v[0] for k, v in query_params.items() if k.startswith("vk_") and k != "sign"}
 
 
 
 
 
1037
 
1038
+ # Сортируем параметры по алфавиту
1039
+ vk_subset_sorted = sorted(vk_subset.items())
1040
 
1041
+ # Формируем строку для подписи
1042
+ data_to_sign = urlencode(vk_subset_sorted, doseq=True)
1043
+
1044
+ # Создаем подпись
1045
+ hash_code = b64encode(HMAC(secret.encode(), data_to_sign.encode(), sha256).digest()).decode('utf-8')
1046
  decoded_hash_code = hash_code[:-1].replace('+', '-').replace('/', '_')
1047
 
1048
+ # Получаем подпись из параметра "sign"
1049
+ received_sign = query_params.get('sign', [None])[0]
1050
+
1051
+ # Логирование для отладки
1052
  logging.debug(f"Строка для подписи: {data_to_sign}")
1053
  logging.debug(f"Вычисленная подпись (Base64): {decoded_hash_code}")
1054
+ logging.debug(f"Полученная подпись из запроса: {received_sign}")
1055
 
1056
+ return received_sign == decoded_hash_code
 
1057
 
1058
  # Чтение ордера по ключу и ВК ИД для приложения
1059
  @app.route('/get_order', methods=['POST'])
 
1062
  logging.debug("Начало обработки запроса get_order")
1063
 
1064
  # Чтение параметров из POST-запроса
1065
+ fullUrl = request.form.get('fullUrl', '') # Получаем полный URL из запроса
1066
  vkid = request.form.get('vk_id', '')
1067
  order = request.form.get('order', '')
1068
+ apps_id = request.form.get('apps_id', '')
 
1069
 
1070
  # Логирование параметров запроса
1071
+ logging.debug(f"Полученные параметры: vk_id: {vkid}, order: {order}, apps_id: {apps_id}")
1072
 
1073
  # Получение ключей приложения
1074
  api_key_apps_vk_dict = json.loads(api_key_apps_vk)
 
1080
  return jsonify({"error": "Secret key not found for app ID"}), 400
1081
 
1082
  # Проверка подписи
1083
+ if not is_valid(full_url=fullUrl, secret=secret_key):
1084
+ logging.error(f"Неверная подпись для запроса: {fullUrl}")
1085
  return jsonify({"error": "Invalid signature"}), 400
1086
 
1087
  # Проверка наличия vk_id и order
 
1126
 
1127
 
1128
 
1129
+
1130
+
1131
+
1132
+
1133
+
1134
+
1135
+
1136
+
1137
+
1138
+
1139
+
1140
+
1141
+
1142
+
1143
+
1144
+
1145
+
1146
+
1147
+
1148
+
1149
+
1150
+
1151
+
1152
+
1153
+
1154
+
1155
+
1156
+
1157
 
1158
 
1159