From 424938133e84c6e7122bae7d4f3af94ea1bfbef1 Mon Sep 17 00:00:00 2001 From: Adriapp Date: Thu, 18 Jun 2026 00:20:27 +0200 Subject: [PATCH] Fix bugs and security issues (backward compatible) - VariablesMaker: fix call to undefined method parsePassport() -> parsePassportData() - BotAPI: fix wrong exception namespace (neneone\neneone -> neneone\SnapeBot) - BotAPI: fix getMe method definition (was a copy of sendMessage params) - DatabaseManager/SnapeBot: whitelist table name and setPage field to prevent SQL injection on identifiers - SnapeBot: use a random IV for callback data encryption (decrypt stays backward compatible with the old fixed-IV format) and warn when default encryption key/iv are used - DatabaseManager: set PDO charset=utf8mb4 and ERRMODE_EXCEPTION - SnapeBot: initialize $builtSettings, fix namespace case in BotAPI instantiation - composer.json: align license with LICENSE file (GPL-3.0-or-later), minimum-stability stable Co-Authored-By: WOZCODE --- composer.json | 4 ++-- src/BotAPI.php | 4 ++-- src/DatabaseManager.php | 7 ++++++- src/SnapeBot.php | 26 +++++++++++++++++++++++--- src/VariablesMaker.php | 2 +- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/composer.json b/composer.json index c239046..f2164a5 100644 --- a/composer.json +++ b/composer.json @@ -2,7 +2,7 @@ "name": "neneone/snapebot", "description": "PHP class-based framework to create Telegram Bots using webhook.", "type": "project", - "license": "AGPL-3.0-only", + "license": "GPL-3.0-or-later", "keywords": [ "telegram", "bot", @@ -23,7 +23,7 @@ "ext-pdo": "*", "ext-json": "*" }, - "minimum-stability": "dev", + "minimum-stability": "stable", "autoload": { "psr-4": { "neneone\\SnapeBot\\": "src/" diff --git a/src/BotAPI.php b/src/BotAPI.php index 9c6f4d1..8821ed3 100644 --- a/src/BotAPI.php +++ b/src/BotAPI.php @@ -29,7 +29,7 @@ public function __construct($token) public function __call($name, $args) { - $methodsList = json_decode('{"getUpdates":[{"name":"offset","required":false},{"name":"limit","required":false},{"name":"timeout","required":false},{"name":"allowed_updates","required":false}],"setWebhook":[{"name":"url","required":true},{"name":"certificate","required":false},{"name":"max_connections","required":false},{"name":"allowed_updates","required":false}],"deleteWebhook":[{"name":"url","required":false},{"name":"has_custom_certificate","required":false},{"name":"pending_update_count","required":false},{"name":"last_error_date","required":false},{"name":"last_error_message","required":false},{"name":"max_connections","required":false},{"name":"allowed_updates","required":false}],"getWebhookInfo":[{"name":"url","required":false},{"name":"has_custom_certificate","required":false},{"name":"pending_update_count","required":false},{"name":"last_error_date","required":false},{"name":"last_error_message","required":false},{"name":"max_connections","required":false},{"name":"allowed_updates","required":false}],"getMe":[{"name":"chat_id","required":true},{"name":"text","required":true},{"name":"parse_mode","required":false},{"name":"disable_web_page_preview","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendMessage":[{"name":"chat_id","required":true},{"name":"text","required":true},{"name":"parse_mode","required":false},{"name":"disable_web_page_preview","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"forwardMessage":[{"name":"chat_id","required":true},{"name":"from_chat_id","required":true},{"name":"disable_notification","required":false},{"name":"message_id","required":true}],"sendPhoto":[{"name":"chat_id","required":true},{"name":"photo","required":true},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendAudio":[{"name":"chat_id","required":true},{"name":"audio","required":true},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"duration","required":false},{"name":"performer","required":false},{"name":"title","required":false},{"name":"thumb","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendDocument":[{"name":"chat_id","required":true},{"name":"document","required":true},{"name":"thumb","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendVideo":[{"name":"chat_id","required":true},{"name":"video","required":true},{"name":"duration","required":false},{"name":"width","required":false},{"name":"height","required":false},{"name":"thumb","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"supports_streaming","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendAnimation":[{"name":"chat_id","required":true},{"name":"animation","required":true},{"name":"duration","required":false},{"name":"width","required":false},{"name":"height","required":false},{"name":"thumb","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendVoice":[{"name":"chat_id","required":true},{"name":"voice","required":true},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"duration","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendVideoNote":[{"name":"chat_id","required":true},{"name":"video_note","required":true},{"name":"duration","required":false},{"name":"length","required":false},{"name":"thumb","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendMediaGroup":[{"name":"chat_id","required":true},{"name":"media","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false}],"sendLocation":[{"name":"chat_id","required":true},{"name":"latitude","required":true},{"name":"longitude","required":true},{"name":"live_period","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"editMessageLiveLocation":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"latitude","required":true},{"name":"longitude","required":true},{"name":"reply_markup","required":false}],"stopMessageLiveLocation":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"reply_markup","required":false}],"sendVenue":[{"name":"chat_id","required":true},{"name":"latitude","required":true},{"name":"longitude","required":true},{"name":"title","required":true},{"name":"address","required":true},{"name":"foursquare_id","required":false},{"name":"foursquare_type","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendContact":[{"name":"chat_id","required":true},{"name":"phone_number","required":true},{"name":"first_name","required":true},{"name":"last_name","required":false},{"name":"vcard","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendPoll":[{"name":"chat_id","required":true},{"name":"question","required":true},{"name":"options","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendChatAction":[{"name":"chat_id","required":true},{"name":"action","required":true}],"getUserProfilePhotos":[{"name":"user_id","required":true},{"name":"offset","required":false},{"name":"limit","required":false}],"getFile":[{"name":"file_id","required":true}],"kickChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true},{"name":"until_date","required":false}],"unbanChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true}],"restrictChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true},{"name":"permissions","required":true},{"name":"until_date","required":false}],"promoteChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true},{"name":"can_change_info","required":false},{"name":"can_post_messages","required":false},{"name":"can_edit_messages","required":false},{"name":"can_delete_messages","required":false},{"name":"can_invite_users","required":false},{"name":"can_restrict_members","required":false},{"name":"can_pin_messages","required":false},{"name":"can_promote_members","required":false}],"setChatPermissions":[{"name":"chat_id","required":true},{"name":"permissions","required":true}],"exportChatInviteLink":[{"name":"chat_id","required":true}],"setChatPhoto":[{"name":"chat_id","required":true},{"name":"photo","required":true}],"deleteChatPhoto":[{"name":"chat_id","required":true}],"setChatTitle":[{"name":"chat_id","required":true},{"name":"title","required":true}],"setChatDescription":[{"name":"chat_id","required":true},{"name":"description","required":false}],"pinChatMessage":[{"name":"chat_id","required":true},{"name":"message_id","required":true},{"name":"disable_notification","required":false}],"unpinChatMessage":[{"name":"chat_id","required":true}],"leaveChat":[{"name":"chat_id","required":true}],"getChat":[{"name":"chat_id","required":true}],"getChatAdministrators":[{"name":"chat_id","required":true}],"getChatMembersCount":[{"name":"chat_id","required":true}],"getChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true}],"setChatStickerSet":[{"name":"chat_id","required":true},{"name":"sticker_set_name","required":true}],"deleteChatStickerSet":[{"name":"chat_id","required":true}],"answerCallbackQuery":[{"name":"callback_query_id","required":true},{"name":"text","required":false},{"name":"show_alert","required":false},{"name":"url","required":false},{"name":"cache_time","required":false}],"editMessageText":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"text","required":true},{"name":"parse_mode","required":false},{"name":"disable_web_page_preview","required":false},{"name":"reply_markup","required":false}],"editMessageCaption":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"reply_markup","required":false}],"editMessageMedia":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"media","required":true},{"name":"reply_markup","required":false}],"editMessageReplyMarkup":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"reply_markup","required":false}],"stopPoll":[{"name":"chat_id","required":true},{"name":"message_id","required":true},{"name":"reply_markup","required":false}],"deleteMessage":[{"name":"chat_id","required":true},{"name":"message_id","required":true}],"sendSticker":[{"name":"chat_id","required":true},{"name":"sticker","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"getStickerSet":[{"name":"name","required":true}],"uploadStickerFile":[{"name":"user_id","required":true},{"name":"png_sticker","required":true}],"createNewStickerSet":[{"name":"user_id","required":true},{"name":"name","required":true},{"name":"title","required":true},{"name":"png_sticker","required":true},{"name":"emojis","required":true},{"name":"contains_masks","required":false},{"name":"mask_position","required":false}],"addStickerToSet":[{"name":"user_id","required":true},{"name":"name","required":true},{"name":"png_sticker","required":true},{"name":"emojis","required":true},{"name":"mask_position","required":false}],"setStickerPositionInSet":[{"name":"sticker","required":true},{"name":"position","required":true}],"deleteStickerFromSet":[{"name":"sticker","required":true}],"answerInlineQuery":[{"name":"inline_query_id","required":true},{"name":"results","required":true},{"name":"cache_time","required":false},{"name":"is_personal","required":false},{"name":"next_offset","required":false},{"name":"switch_pm_text","required":false},{"name":"switch_pm_parameter","required":false}],"sendInvoice":[{"name":"chat_id","required":true},{"name":"title","required":true},{"name":"description","required":true},{"name":"payload","required":true},{"name":"provider_token","required":true},{"name":"start_parameter","required":true},{"name":"currency","required":true},{"name":"prices","required":true},{"name":"provider_data","required":false},{"name":"photo_url","required":false},{"name":"photo_size","required":false},{"name":"photo_width","required":false},{"name":"photo_height","required":false},{"name":"need_name","required":false},{"name":"need_phone_number","required":false},{"name":"need_email","required":false},{"name":"need_shipping_address","required":false},{"name":"send_phone_number_to_provider","required":false},{"name":"send_email_to_provider","required":false},{"name":"is_flexible","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"answerShippingQuery":[{"name":"shipping_query_id","required":true},{"name":"ok","required":true},{"name":"shipping_options","required":false},{"name":"error_message","required":false}],"answerPreCheckoutQuery":[{"name":"pre_checkout_query_id","required":true},{"name":"ok","required":true},{"name":"error_message","required":false}],"setPassportDataErrors":[{"name":"user_id","required":true},{"name":"errors","required":true}],"sendGame":[{"name":"chat_id","required":true},{"name":"game_short_name","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"setGameScore":[{"name":"user_id","required":true},{"name":"score","required":true},{"name":"force","required":false},{"name":"disable_edit_message","required":false},{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false}],"getGameHighScores":[{"name":"user_id","required":true},{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false}]}', true); + $methodsList = json_decode('{"getUpdates":[{"name":"offset","required":false},{"name":"limit","required":false},{"name":"timeout","required":false},{"name":"allowed_updates","required":false}],"setWebhook":[{"name":"url","required":true},{"name":"certificate","required":false},{"name":"max_connections","required":false},{"name":"allowed_updates","required":false}],"deleteWebhook":[{"name":"url","required":false},{"name":"has_custom_certificate","required":false},{"name":"pending_update_count","required":false},{"name":"last_error_date","required":false},{"name":"last_error_message","required":false},{"name":"max_connections","required":false},{"name":"allowed_updates","required":false}],"getWebhookInfo":[{"name":"url","required":false},{"name":"has_custom_certificate","required":false},{"name":"pending_update_count","required":false},{"name":"last_error_date","required":false},{"name":"last_error_message","required":false},{"name":"max_connections","required":false},{"name":"allowed_updates","required":false}],"getMe":[],"sendMessage":[{"name":"chat_id","required":true},{"name":"text","required":true},{"name":"parse_mode","required":false},{"name":"disable_web_page_preview","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"forwardMessage":[{"name":"chat_id","required":true},{"name":"from_chat_id","required":true},{"name":"disable_notification","required":false},{"name":"message_id","required":true}],"sendPhoto":[{"name":"chat_id","required":true},{"name":"photo","required":true},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendAudio":[{"name":"chat_id","required":true},{"name":"audio","required":true},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"duration","required":false},{"name":"performer","required":false},{"name":"title","required":false},{"name":"thumb","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendDocument":[{"name":"chat_id","required":true},{"name":"document","required":true},{"name":"thumb","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendVideo":[{"name":"chat_id","required":true},{"name":"video","required":true},{"name":"duration","required":false},{"name":"width","required":false},{"name":"height","required":false},{"name":"thumb","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"supports_streaming","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendAnimation":[{"name":"chat_id","required":true},{"name":"animation","required":true},{"name":"duration","required":false},{"name":"width","required":false},{"name":"height","required":false},{"name":"thumb","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendVoice":[{"name":"chat_id","required":true},{"name":"voice","required":true},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"duration","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendVideoNote":[{"name":"chat_id","required":true},{"name":"video_note","required":true},{"name":"duration","required":false},{"name":"length","required":false},{"name":"thumb","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendMediaGroup":[{"name":"chat_id","required":true},{"name":"media","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false}],"sendLocation":[{"name":"chat_id","required":true},{"name":"latitude","required":true},{"name":"longitude","required":true},{"name":"live_period","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"editMessageLiveLocation":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"latitude","required":true},{"name":"longitude","required":true},{"name":"reply_markup","required":false}],"stopMessageLiveLocation":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"reply_markup","required":false}],"sendVenue":[{"name":"chat_id","required":true},{"name":"latitude","required":true},{"name":"longitude","required":true},{"name":"title","required":true},{"name":"address","required":true},{"name":"foursquare_id","required":false},{"name":"foursquare_type","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendContact":[{"name":"chat_id","required":true},{"name":"phone_number","required":true},{"name":"first_name","required":true},{"name":"last_name","required":false},{"name":"vcard","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendPoll":[{"name":"chat_id","required":true},{"name":"question","required":true},{"name":"options","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"sendChatAction":[{"name":"chat_id","required":true},{"name":"action","required":true}],"getUserProfilePhotos":[{"name":"user_id","required":true},{"name":"offset","required":false},{"name":"limit","required":false}],"getFile":[{"name":"file_id","required":true}],"kickChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true},{"name":"until_date","required":false}],"unbanChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true}],"restrictChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true},{"name":"permissions","required":true},{"name":"until_date","required":false}],"promoteChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true},{"name":"can_change_info","required":false},{"name":"can_post_messages","required":false},{"name":"can_edit_messages","required":false},{"name":"can_delete_messages","required":false},{"name":"can_invite_users","required":false},{"name":"can_restrict_members","required":false},{"name":"can_pin_messages","required":false},{"name":"can_promote_members","required":false}],"setChatPermissions":[{"name":"chat_id","required":true},{"name":"permissions","required":true}],"exportChatInviteLink":[{"name":"chat_id","required":true}],"setChatPhoto":[{"name":"chat_id","required":true},{"name":"photo","required":true}],"deleteChatPhoto":[{"name":"chat_id","required":true}],"setChatTitle":[{"name":"chat_id","required":true},{"name":"title","required":true}],"setChatDescription":[{"name":"chat_id","required":true},{"name":"description","required":false}],"pinChatMessage":[{"name":"chat_id","required":true},{"name":"message_id","required":true},{"name":"disable_notification","required":false}],"unpinChatMessage":[{"name":"chat_id","required":true}],"leaveChat":[{"name":"chat_id","required":true}],"getChat":[{"name":"chat_id","required":true}],"getChatAdministrators":[{"name":"chat_id","required":true}],"getChatMembersCount":[{"name":"chat_id","required":true}],"getChatMember":[{"name":"chat_id","required":true},{"name":"user_id","required":true}],"setChatStickerSet":[{"name":"chat_id","required":true},{"name":"sticker_set_name","required":true}],"deleteChatStickerSet":[{"name":"chat_id","required":true}],"answerCallbackQuery":[{"name":"callback_query_id","required":true},{"name":"text","required":false},{"name":"show_alert","required":false},{"name":"url","required":false},{"name":"cache_time","required":false}],"editMessageText":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"text","required":true},{"name":"parse_mode","required":false},{"name":"disable_web_page_preview","required":false},{"name":"reply_markup","required":false}],"editMessageCaption":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"caption","required":false},{"name":"parse_mode","required":false},{"name":"reply_markup","required":false}],"editMessageMedia":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"media","required":true},{"name":"reply_markup","required":false}],"editMessageReplyMarkup":[{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false},{"name":"reply_markup","required":false}],"stopPoll":[{"name":"chat_id","required":true},{"name":"message_id","required":true},{"name":"reply_markup","required":false}],"deleteMessage":[{"name":"chat_id","required":true},{"name":"message_id","required":true}],"sendSticker":[{"name":"chat_id","required":true},{"name":"sticker","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"getStickerSet":[{"name":"name","required":true}],"uploadStickerFile":[{"name":"user_id","required":true},{"name":"png_sticker","required":true}],"createNewStickerSet":[{"name":"user_id","required":true},{"name":"name","required":true},{"name":"title","required":true},{"name":"png_sticker","required":true},{"name":"emojis","required":true},{"name":"contains_masks","required":false},{"name":"mask_position","required":false}],"addStickerToSet":[{"name":"user_id","required":true},{"name":"name","required":true},{"name":"png_sticker","required":true},{"name":"emojis","required":true},{"name":"mask_position","required":false}],"setStickerPositionInSet":[{"name":"sticker","required":true},{"name":"position","required":true}],"deleteStickerFromSet":[{"name":"sticker","required":true}],"answerInlineQuery":[{"name":"inline_query_id","required":true},{"name":"results","required":true},{"name":"cache_time","required":false},{"name":"is_personal","required":false},{"name":"next_offset","required":false},{"name":"switch_pm_text","required":false},{"name":"switch_pm_parameter","required":false}],"sendInvoice":[{"name":"chat_id","required":true},{"name":"title","required":true},{"name":"description","required":true},{"name":"payload","required":true},{"name":"provider_token","required":true},{"name":"start_parameter","required":true},{"name":"currency","required":true},{"name":"prices","required":true},{"name":"provider_data","required":false},{"name":"photo_url","required":false},{"name":"photo_size","required":false},{"name":"photo_width","required":false},{"name":"photo_height","required":false},{"name":"need_name","required":false},{"name":"need_phone_number","required":false},{"name":"need_email","required":false},{"name":"need_shipping_address","required":false},{"name":"send_phone_number_to_provider","required":false},{"name":"send_email_to_provider","required":false},{"name":"is_flexible","required":false},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"answerShippingQuery":[{"name":"shipping_query_id","required":true},{"name":"ok","required":true},{"name":"shipping_options","required":false},{"name":"error_message","required":false}],"answerPreCheckoutQuery":[{"name":"pre_checkout_query_id","required":true},{"name":"ok","required":true},{"name":"error_message","required":false}],"setPassportDataErrors":[{"name":"user_id","required":true},{"name":"errors","required":true}],"sendGame":[{"name":"chat_id","required":true},{"name":"game_short_name","required":true},{"name":"disable_notification","required":false},{"name":"reply_to_message_id","required":false},{"name":"reply_markup","required":false}],"setGameScore":[{"name":"user_id","required":true},{"name":"score","required":true},{"name":"force","required":false},{"name":"disable_edit_message","required":false},{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false}],"getGameHighScores":[{"name":"user_id","required":true},{"name":"chat_id","required":false},{"name":"message_id","required":false},{"name":"inline_message_id","required":false}]}', true); if (array_key_exists($name, $methodsList)) { if (is_array($args[0])) { return $this->BotAPI($name, $args[0]); @@ -42,7 +42,7 @@ public function __call($name, $args) } return $this->BotAPI($name, $argsAPI); } else { - throw new \neneone\neneone\Exception('Method not found'); + throw new \neneone\SnapeBot\Exception('Method not found'); } } diff --git a/src/DatabaseManager.php b/src/DatabaseManager.php index e4d04aa..4a5f725 100644 --- a/src/DatabaseManager.php +++ b/src/DatabaseManager.php @@ -25,7 +25,9 @@ trait DatabaseManager public function connectToDatabase($host, $databaseName, $username, $password) { try { - $db = new \PDO('mysql:host='.$host.';dbname='.$databaseName, $username, $password); + $db = new \PDO('mysql:host='.$host.';dbname='.$databaseName.';charset=utf8mb4', $username, $password, [ + \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, + ]); } catch (\PDOException $e) { throw new \neneone\SnapeBot\Exception('PDOException during connection to database', 0, $e); } @@ -71,6 +73,9 @@ public function setPage($page = '', $userID = false, $field = 'page') { if($userID == false) { if(isset($this->userID)) $userID = $this->userID; else throw new Exception('Missing userID while required in setPage'); } + if (!preg_match('/^[A-Za-z0-9_]+$/', $field)) { + throw new Exception('Invalid field name in setPage.'); + } $q = $this->db->prepare('UPDATE '.$this->tName.' SET ' . $field . ' = :page WHERE userID = :userID'); $q->bindParam(':page', $page); $q->bindParam(':userID', $userID); diff --git a/src/SnapeBot.php b/src/SnapeBot.php index 03504ef..7325b0a 100644 --- a/src/SnapeBot.php +++ b/src/SnapeBot.php @@ -114,9 +114,15 @@ public function __construct($botToken, $update, $settings = []) $this->botToken = $botToken; $this->botUsername = $this->settings['botUsername']; $this->tName = is_array($this->settings['database']) ? ($this->settings['database']['tableName'] ?? 'SnapeBot') : 'SnapeBot'; + if (!preg_match('/^[A-Za-z0-9_]+$/', $this->tName)) { + throw new Exception('Invalid table name. Only letters, numbers and underscores are allowed.'); + } + if ($this->settings['cbDataEncryption'] && ('SnapeBotKey2019' === $this->settings['encryptionData']['key'] || 'SnapeBotAwesomeIV2019' === $this->settings['encryptionData']['iv'])) { + trigger_error('SnapeBot: cbDataEncryption is enabled but the default encryption key/iv are in use. Set your own "encryptionData" key and iv, otherwise the callback data encryption is not secure.', E_USER_WARNING); + } if ($this->settings['getBotInformations'] || !isset($this->settings['botUsername'])) { - $getMe = (new \neneone\snapeBot\BotAPI($botToken))->getMe(); + $getMe = (new \neneone\SnapeBot\BotAPI($botToken))->getMe(); if (isset($getMe['result']['username'])) { $this->botInformations = $getMe['result']; $this->settings['botUsername'] = $this->botInformations['username']; @@ -145,6 +151,7 @@ public static function buildSettings($settings, $settingsScheme = false) if ($settingsScheme == false) { $settingsScheme = self::$settingsScheme; } + $builtSettings = []; foreach ($settingsScheme as $setting => $structure) { if (!isset($settings[$setting]) && true == $structure['required']) { throw new Exception('Missing required setting: '.$setting.'.'); @@ -263,14 +270,27 @@ private function firstRun() public function specialEncrypt($string) { $key = hash('sha256', $this->settings['encryptionData']['key']); - $iv = substr(hash('sha256', $this->settings['encryptionData']['iv']), 0, 16); + $iv = openssl_random_pseudo_bytes(16); + $cipher = openssl_encrypt($string, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); - return base64_encode(openssl_encrypt($string, 'AES-256-CBC', $key, 0, $iv)); + // The leading '!' marks the new format (random IV prepended to the + // ciphertext). '!' is not part of the base64 alphabet, so it can never + // collide with data produced by older versions. + return '!'.base64_encode($iv.$cipher); } public function specialDecrypt($string) { $key = hash('sha256', $this->settings['encryptionData']['key']); + if (isset($string[0]) && '!' === $string[0]) { + $raw = base64_decode(substr($string, 1)); + $iv = substr($raw, 0, 16); + $cipher = substr($raw, 16); + + return openssl_decrypt($cipher, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); + } + + // Backward compatibility: data encrypted by older versions used a fixed IV. $iv = substr(hash('sha256', $this->settings['encryptionData']['iv']), 0, 16); return openssl_decrypt(base64_decode($string), 'AES-256-CBC', $key, 0, $iv); diff --git a/src/VariablesMaker.php b/src/VariablesMaker.php index 8721abf..773ca03 100644 --- a/src/VariablesMaker.php +++ b/src/VariablesMaker.php @@ -275,7 +275,7 @@ public function parseMessage($message) $r['connectedWebsite'] = $message['connected_website']; } if (isset($message['passport_data'])) { - $r['passportData'] = $this->parsePassport($message['passport_data']); + $r['passportData'] = $this->parsePassportData($message['passport_data']); } if (isset($message['reply_markup'])) { $r['replyMarkup'] = $message['reply_markup'];