CRT のセキュリティ機能
多くの古い CRT 関数には、セキュリティが強化された新しいバージョンがあります。 セキュリティで保護された関数が存在する場合、古い、安全性の低いバージョンは非推奨としてマークされます。 新しいバージョンには 、 _s
("secure") サフィックスが付いています。
このコンテキストでは、"非推奨" とは、関数の使用が推奨されていないことを意味します。 これは、関数が CRT から削除されることを意味するものではありません。
セキュリティ保護された関数は、セキュリティ エラーが防止されたり修正されたりするわけではありません。 そうではなく、発生したエラーがキャッチされます。 エラー状態に対して追加のチェックを行います。 エラーが発生した場合は、エラー ハンドラーを呼び出します (「パラメーターの検証」を参照)。
たとえば、コピーする文字列が strcpy
コピー先バッファーに対して大きすぎるかどうかをこの関数で確認することはできません。 セキュリティ保護されたバージョンの strcpy_s
は、バッファーのサイズをパラメーターとして受け取ります。 そのため、バッファー オーバーランが発生するかどうかを判断できます。 11 文字を 10 文字のバッファーにコピーする場合 strcpy_s
は、エラー strcpy_s
になります。間違いを修正できません。 ただし、エラーを検出し、無効なパラメーター ハンドラーを呼び出して通知することができます。
非推奨に関する警告を除去する
低いセキュリティ レベルの古い関数に対する非推奨警告を除去するには、いくつかの方法があります。 最も簡単なのは、プラグマを定義 _CRT_SECURE_NO_WARNINGS
または使用することです warning
。 どちらの方法でも警告は無効になりますが、その警告の原因になったセキュリティの問題はそのまま存在します。 非推奨に関する警告を有効にしたまま、新しい CRT セキュリティ機能を利用するのがよい方法です。
C++ では、非推奨の警告を排除する最も簡単な方法は、セキュリティで保護されたテンプレート オーバーロードを使用 することです。 オーバーロードにより、多くの場合、非推奨の警告が排除されます。 非推奨の関数の呼び出しを、セキュリティで保護されたバージョンの関数の呼び出しに置き換えます。 たとえば、この非推奨とされている strcpy
の呼び出しについて考えます:
char szBuf[10];
strcpy(szBuf, "test"); // warning: deprecated
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES
を 1 として定義すると、strcpy
の呼び出しが、バッファー オーバーランを防ぐ strcpy_s
の呼び出しに変更され、警告は除去されます。 詳細については、「セキュリティで保護されたテンプレート オーバーロード」を参照してください。
セキュリティで保護されたテンプレート オーバーロードのない、非推奨の関数の場合、セキュリティで保護されたバージョンを使用するように手動でコードを更新することを強くお勧めします。
セキュリティには関連しませんが、非推奨に関する警告が発生する別の要因として、POSIX 関数があります。 POSIX 関数名を標準の同等の名前に置き換えます (例: 変更 access
) _access
か、定義して POSIX 関連の非推奨の警告を _CRT_NONSTDC_NO_WARNINGS
無効にします。 詳細については、「互換性」をご覧ください。
その他のセキュリティ機能
一部のセキュリティ機能を次に示します。
パラメーター検証
セキュリティ保護された関数と、その非セキュリティ保護バージョンの多くでは、パラメーターが検証されます。 検証には次のものが含まれます。
- 値の
NULL
チェック。 - 列挙値が有効であるかどうかのチェック。
- 整数値が有効な範囲にあるかどうかのチェック。
詳細については、「パラメーターの検証」を参照してください。
開発者も無効なパラメーターのハンドラーを利用できるようになりました。 関数が無効なパラメーターを検出すると、アプリケーションをアサートして終了する代わりに、CRT を使用して
_set_invalid_parameter_handler
_set_thread_local_invalid_parameter_handler
これらの問題をチェックできます。- 値の
サイズ設定されたバッファー
バッファーに書き込むセキュリティ保護された関数には、バッファー サイズを渡す必要があります。 セキュリティ保護されたバージョンでは、書き込みの前に、バッファーが十分な大きさであることが検証されます。 この検証は、悪意のあるコードの実行を許可する可能性がある、危険なバッファー オーバーラン エラーを回避するのに役立ちます。 通常、これらの関数は、
errno
エラー コードを返し、バッファーのサイズが小さすぎる場合、無効なパラメーター ハンドラーを呼び出します。gets
など、入力バッファーからの読み込みを行う関数のセキュリティで保護されたバージョンでは、最大サイズを指定する必要があります。Null 終了
文字列に終端文字を設定しない可能性がある一部の関数には、確実に文字列を null で終わらせる、セキュリティ保護バージョンがあります。
強化されたエラー報告
セキュリティ保護された関数では、以前から存在する関数より詳細なエラー情報を含むエラー コードが返されます。 現在、セキュリティ保護された関数と多くの以前から存在する関数は、
errno
を設定するため、より詳細なエラー情報を提供するerrno
コード型も返すことが多いです。ファイルシステムのセキュリティ
セキュリティで保護されたファイル I/O API では、既定のケースで安全なファイル アクセスをサポートします。
Windows のセキュリティ
セキュリティで保護されたプロセス API では、セキュリティ ポリシーが適用され、ACL を指定できます。
書式指定文字列構文のチェック
書式指定文字列で
printf
正しくない型フィールド文字を使用した場合など、無効な文字列が検出されます。
関連項目
パラメーターの検証
テンプレートのオーバーロードをセキュリティで保護する
C ランタイム (CRT) と C++ 標準ライブラリ (STL) .lib
ファイル