信頼できないデータの取り扱い
Qt での信頼できないデータの取り扱いに関するアドバイス。
信頼できないデータ
信頼できないデータとは、アプリケーションがその完全性を保証できないソースから得られるデータのことです。信頼できないデータの例としては、ユーザーから提供されたデータ、ネットワークデータ、生成されたデータ、あるいはアプリケーションが直接作成していないデータなどが挙げられます。信頼できないデータを不適切に扱うと、アプリケーションのクラッシュ、個人データの漏洩、ユーザーやハードウェアへの損害につながる可能性があります。 したがって、開発者は、コードが信頼できないデータをどのように受け取り、処理するかについて細心の注意を払う必要があります。
データの安全性を確保する責任は、最終的にはアプリケーション側にあります。ただし、アプリケーションは、データを安全に処理および検証するために開発されている Qt の特定の部分に依存することができます。例えば、Qt モジュールは、画像の検証、文字列の安全な操作、および受信ネットワークパケットの処理を行うことができます。 Qtでは、こうした種類の機能をセキュリティ上重要なものと位置付けています。セキュリティ上重要なAPIは、開発中に厳格な審査とテストが行われます。
Qtプロジェクトでは、Qt機能の設計とテストに関する包括的なプロセスを定めています。Qtのセキュリティポリシーの詳細については、「Qtのセキュリティ」を参照してください。
Qt によるリスクと脆弱性の軽減
Qtを使用することで、信頼できないデータを処理する際のリスクの多くを軽減できます。以下のセクションでは、Qtアプリケーションにおける信頼できないデータの取り扱いに関する側面について説明します。
ユーザー入力の検証
適切な入力検証が行われないと、データに誤りが生じたり、予期しない動作を引き起こしたりする可能性があります。しかし、厳格な検証ルールは、ユーザーによるデータ入力を妨げることもあります。例えば、特定の文字の使用を禁止すると、ユーザーが誤った情報や脆弱なパスワードを入力してしまう結果になる可能性があります。
Qt には、ユーザー入力用のバリデータがいくつか用意されています。参照:
- QValidator および「ラインエディットの例- C++ バリデータと例」
- Qt Quick バリデータ— QML バリデータ
コマンドインジェクション
一般的なセキュリティ上の脆弱性として、外部プロセスによる悪意のあるコマンドの実行が挙げられます。信頼できないデータからのコマンド実行は、ユーザーデータの漏洩、プライベートリソースへのアクセス、その他の悪意のある活動につながる可能性があります。また、アプリケーションが信頼できないデータと信頼できるデータを組み合わせることで、データが汚染されることもあります。
一般的な対策としては、テキストを検証し、実行可能なコマンドから分離することが挙げられます。サーバー側とクライアント側の両方で検証を行い、明示的なコマンドの許可リストを使用すること、およびデータの慎重な解析を行うことも、リスクの軽減に役立ちます。また、テキストスクリプトを実行する代わりに、システムコマンドを実行する信頼できるプラグインやライブラリを使用することも推奨されます。
画像のデコード
信頼できないソースからの画像は、システムのクラッシュやパフォーマンスの低下を引き起こす可能性があります。アプリケーションでは、画像を読み込んだり処理したりする前に、画像のパス、画像の種類、ファイル拡張子を適切に処理するようにしてください。また、アプリケーションは、パフォーマンスを低下させたりクラッシュさせたりすることなく、大容量の画像や予期しない形式の画像を処理できる必要があります。
データの逆シリアル化
信頼境界の外側から取得されたデータは、信頼できないデータとして扱い、追加の精査を行う必要があります。シリアライズされたデータは破損していたり、悪意のあるコンテンツを含んでいる可能性があります。これらのデータをデシリアライズすると、データの誤り、アプリケーションのクラッシュ、または悪意のあるコードの実行につながる恐れがあります。 暗号化やハッシュ化などの手法を用いて、内容の整合性を確認してください。また、データをデシリアライズする際は、エラーを適切に処理し、システムのクラッシュを防ぐようにしてください。
詳細については、以下を参照してください。
- Qt シリアライゼーション
- Corruption and Security (QDataStream )を参照してください。
Qt Qml および JavaScript ソース
Qt Qml は、アプリケーション開発者がすべてのコードとリソースを提供することを前提としています。QMLは、基本的な保護機能を備えた、一般的にメモリセーフな言語です。ただし、QMLには独立したプライバシードメインという概念はありません。つまり、リモートから読み込まれたものであれローカルから読み込まれたものであれ、あらゆるコードがそのスコープ内のすべてのデータにアクセスできるということです。
QML アプリケーションは、ローカルファイルシステムから、または Qtのリソースシステムを通じてリソースを読み込む必要があります。ネットワークの利用が必要な場合は、HTTPS 経由、または信頼されたネットワーク内でリソースを取得してください。
© 2026 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.