信頼できないデータの取り扱い

Qt で信頼できないデータを扱う際のアドバイスです。

信頼できないデータ

信頼できないデータとは、アプリケーションがその完全性を保証できないソースから来たデータのことです。信頼できないデータの例としては、ユーザーが提供したデータ、ネットワークデータ、生成されたデータ、アプリケーションが直接作成したものではないデータなどがあります。信頼できないデータの不適切な扱いは、アプリケーションのクラッシュ、個人データの漏洩、ユーザやハードウェアへの危害につながる可能性があります。従って、開発者はコードがどのように信頼できないデータを受け取り、処理するかについて用心深くなければなりません。

データが安全であることを保証する責任は、最終的にはアプリケーションにあります。しかし、アプリケーションはデータを安全に処理し、検証するために開発されたQtの特定の部分に依存することができます。例えば、Qtモジュールは画像を検証したり、文字列を安全に操作したり、受信したネットワークパケットを処理したりすることができます。Qtはこのような機能をセキュリティクリティカルとみなします。セキュリティクリティカルなAPIは、開発中に特別な精査とテストが行われます。

Qtプロジェクトでは、Qtの機能を設計し、テストするための広範なプロセスを持っています。Qt のセキュリティポリシーの詳細については、「Qt のセキュリティ」を参照してください。

Qt によるリスクと脆弱性の軽減

Qt を使用することで、信頼できないデータを処理するリスクの多くを減らすことができます。以下のセクションでは、Qt アプリケーションにおける信頼できないデータの取り扱いについて説明します。

ユーザ入力の検証

適切な入力検証を行わないと、誤ったデータや予期せぬ動作を引き起こす可能性があります。しかし、厳格なバリデーション・ルールは、ユーザのデータ入力を妨げることもあります。例えば、特定の文字を入力できないようにすると、ユーザが間違った情報や弱いパスワードを入力してしまう可能性があります。

Qt には、ユーザー入力のためのバリデータがいくつか用意されています。参照してください:

コマンド・インジェクション

一般的なセキュリティの脆弱性は、外部プロセスによる悪意のあるコマンドの実行です。信頼されていないデータからコマンドを実行すると、ユーザーデータの漏洩、プライベートリソースへのアクセス、その他の悪意ある行為につながる可能性があります。アプリケーションはまた、信頼されていないデータを信頼されたデータと組み合わせ、データを汚染する可能性もあります。

一般的な緩和策は、テキストを検証し、実行可能なコマンドから分離することである。コマンドの明示的な許可リスト、サーバサイドとクライアントサイドの両方の検証、データの慎重な解析も、リスクを軽減するのに役立ちます。また、テキストスクリプトを実行するのではなく、システムコマンドを実行する信頼できるプラグインやライブラリを使用することも推奨される。

画像のデコード

信頼できないソースからの画像は、システムクラッシュやパフォーマンスの低下を引き起こす可能性があります。画像を読み込んだり処理したりする前に、アプリケーションが画像パス、画像タイプ、ファイル拡張子をサニタイズするようにしてください。また、アプリケーションは、パフォーマンスを低下させたりクラッシュさせたりすることなく、大きな画像や予期しないフォーマットを処理する必要があります。

データのデシリアライズ

デシリアライズするデータが信頼境界の外から来ている場合は、信頼できないデータとして扱い、データは特別な精査を受けなければなりません。シリアライズされたデータは破損していたり、悪意のあるコンテンツを含んでいる可能性があります。これらのデータをデシリアライズすると、誤ったデータ、アプリケーションのクラッシュ、悪意のあるコードの実行につながる可能性があります。例えば、暗号化やハッシュ化技術を使用して、コンテンツの完全性をチェックしてください。また、データをデシリアライズする際には、エラーを潔く処理し、システム・クラッシュを防ぎましょう。

詳細は

Qt Qml およびJavaScriptソース

Qt Qml は、アプリケーション開発者がすべてのコードとリソースを提供することを前提としています。QML は基本的な保護機能を持つメモリセーフな言語です。しかし、QMLには個別のプライバシードメインという概念はありません。つまり、リモートでロードされたコードであれ、ローカルでロードされたコードであれ、 そのスコープ内の全てのデータにアクセスすることが可能です。

QMLアプリケーションは、ローカルのファイルシステム、もしくはQtのリソースシステムからリソースをロードする必要があります。ネットワークが必要な場合は、HTTPS または信頼できるネットワークからリソースを取得してください。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.