Python の新しい文字列形式の脆弱性の分析と解決策
最近、Python の文字列の書式設定の脆弱性に注目しました。今日は、Python で導入された文字列の書式設定の新しい構文のセキュリティの脆弱性について説明します。
信頼できないユーザー入力に str.format を使用すると、セキュリティ上のリスクが生じます。私は実際にこの問題については長い間知っていましたが、今日までその深刻さに気づきませんでした。攻撃者はこれを使用して Jinja2 サンドボックスをバイパスできるため、深刻な情報漏洩の問題が発生します。それまでの間、この記事の最後に str.format の新しい安全なバージョンを提供します。
これは非常に深刻なセキュリティ リスクであることを思い出していただく必要があります。私がここで記事を書いている理由は、おそらくほとんどの人がそれが悪用されやすいことを知らないからです。
中心的な問題
Python 2.6 以降、Python では、.NET からインスピレーションを得て文字列をフォーマットするための新しい構文が導入されました。もちろん、Python に加えて、Rust や他のいくつかのプログラミング言語もこの構文をサポートしています。 .format() メソッドを使用すると、この構文はバイト文字列と Unicode 文字列の両方 (Python 3 では Unicode 文字列のみ) に適用でき、よりカスタマイズ可能な文字列にもマッピングできます。
この構文の特徴は、文字列形式の位置パラメーターとキーワード パラメーターを決定し、いつでもデータ項目を明示的に並べ替えることができることです。さらに、オブジェクトのプロパティやデータ項目にアクセスすることもできます。これがセキュリティ問題の根本原因です。
全体として、これを悪用して次のことを行うことができます:
>>> 'class of {0} is {0.__class__}'.format(42) "class of 42 is "
基本的に、書式文字列を制御できる人は誰でも、オブジェクトのさまざまな内部プロパティにアクセスできる可能性があります。
何が問題ですか?
最初の質問は、書式文字列を制御する方法です。次の場所から開始できます:
1. 文字列ファイルの信頼できないトランスレーター。複数の言語に翻訳された多くのアプリケーションがこの新しい Python 文字列フォーマット方法を使用しているため、これらは問題なく実行できる可能性が高いですが、誰もが入力されたすべての文字列を徹底的にレビューするわけではありません。
2. ユーザー公開設定。 一部のシステム ユーザーは特定の動作を構成できるため、これらの構成はフォーマット文字列の形式で公開される可能性があります。特別な注意として、一部のユーザーが Web アプリケーションを通じて通知電子メール、ログ メッセージ形式、またはその他の基本的なテンプレートを構成しているのを目にしました。
危険レベル
C インタプリタ オブジェクトを書式文字列に渡すだけの場合は、多くても整数などの一部のものを公開するだけなので、それほど危険はありません。
しかし、この書式文字列にPythonオブジェクトを渡すと面倒になります。これは、Python 関数から公開できるものの量が非常に膨大であるためです。 以下は、キーを漏洩する可能性がある仮想 Web アプリケーションのシナリオです:
CONFIG = { 'SECRET_KEY': 'super secret key' } class Event(object): def __init__(self, id, level, message): self.id = id self.level = level self.message = message def format_event(format_string, event): return format_string.format(event=event)
ユーザーがここに format_string を挿入できる場合、次のように秘密の文字列を見つけることができます:
{event.__init__.__globals__[CONFIG][SECRET_KEY]}
はサンドボックスをフォーマットします
それで、何をすべきか他の人にフォーマット文字列を提供してもらう必要がある場合はそうしますか? 実際、文書化されていない内部メカニズムの一部を使用して、文字列の書式設定の動作を変更することができます。
from string import Formatter from collections import Mapping class MagicFormatMapping(Mapping): """This class implements a dummy wrapper to fix a bug in the Python standard library for string formatting. See http://bugs.python.org/issue13598 for information about why this is necessary. """ def __init__(self, args, kwargs): self._args = args self._kwargs = kwargs self._last_index = 0 def __getitem__(self, key): if key == '': idx = self._last_index self._last_index += 1 try: return self._args[idx] except LookupError: pass key = str(idx) return self._kwargs[key] def __iter__(self): return iter(self._kwargs) def __len__(self): return len(self._kwargs) # This is a necessary API but it's undocumented and moved around # between Python releases try: from _string import formatter_field_name_split except ImportError: formatter_field_name_split = lambda \ x: x._formatter_field_name_split() {C} class SafeFormatter(Formatter): def get_field(self, field_name, args, kwargs): first, rest = formatter_field_name_split(field_name) obj = self.get_value(first, args, kwargs) for is_attr, i in rest: if is_attr: obj = safe_getattr(obj, i) else: obj = obj[i] return obj, first def safe_getattr(obj, attr): # Expand the logic here. For instance on 2.x you will also need # to disallow func_globals, on 3.x you will also need to hide # things like cr_frame and others. So ideally have a list of # objects that are entirely unsafe to access. if attr[:1] == '_': raise AttributeError(attr) return getattr(obj, attr) def safe_format(_string, *args, **kwargs): formatter = SafeFormatter() kwargs = MagicFormatMapping(args, kwargs) return formatter.vformat(_string, args, kwargs)
ここで、safe_format メソッドを使用して str.format を置き換えることができます:
>>> '{0.__class__}'.format(42) "" >>> safe_format('{0.__class__}', 42) Traceback (most recent call last): File "", line 1, in AttributeError: __class__
概要:
プログラム開発には、「いかなるときもユーザー入力を信用してはいけない」という格言があります。今では、この文が完全に意味をなしているように思えます。ですので、学生の皆さんはこのことを心に留めておいてください!
以上がPython の新しい文字列形式の脆弱性の分析と解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









hadidb:軽量で高レベルのスケーラブルなPythonデータベースHadIDB(HadIDB)は、Pythonで記述された軽量データベースで、スケーラビリティが高くなっています。 PIPインストールを使用してHADIDBをインストールする:PIPINSTALLHADIDBユーザー管理CREATEユーザー:CREATEUSER()メソッド新しいユーザーを作成します。 Authentication()メソッドは、ユーザーのIDを認証します。 fromhadidb.operationimportuseruser_obj = user( "admin"、 "admin")user_obj。

Hash値として保存されているため、Navicatを介してMongoDBパスワードを直接表示することは不可能です。紛失したパスワードを取得する方法:1。パスワードのリセット。 2。構成ファイルを確認します(ハッシュ値が含まれる場合があります)。 3.コードを確認します(パスワードをハードコードできます)。

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

データの専門家として、さまざまなソースから大量のデータを処理する必要があります。これは、データ管理と分析に課題をもたらす可能性があります。幸いなことに、AWS GlueとAmazon Athenaの2つのAWSサービスが役立ちます。

Redisサーバーを起動する手順には、以下が含まれます。オペレーティングシステムに従ってRedisをインストールします。 Redis-Server(Linux/Macos)またはRedis-Server.exe(Windows)を介してRedisサービスを開始します。 Redis-Cli ping(Linux/macos)またはRedis-Cli.exePing(Windows)コマンドを使用して、サービスステータスを確認します。 Redis-Cli、Python、node.jsなどのRedisクライアントを使用して、サーバーにアクセスします。

いいえ、MySQLはSQL Serverに直接接続できません。ただし、次のメソッドを使用してデータ相互作用を実装できます。ミドルウェア:MySQLから中間形式にデータをエクスポートしてから、ミドルウェアを介してSQL Serverにインポートします。データベースリンカーの使用:ビジネスツールは、よりフレンドリーなインターフェイスと高度な機能を提供しますが、本質的にはミドルウェアを通じて実装されています。
