2017-08-10 1 views
1

今日、私は発見したこと、次のコンパイルと版画42:ストリームからchar *を読み取っています - 別のバッファオーバーフローの失敗?

#include <iostream> 
#include <sstream> 

int main() 
{ 
    std::stringstream s; 
    s << 42; 
    char c[8]; 
    s >> c; 
    std::cout << c; 
} 

しかし、これは右、潜在的なバッファオーバーフロー攻撃のですか?ユーザーが提供するストリームから読み込んだ場合、データのサイズを簡単に知ることができず、十分なストレージを割り当てることができません。 std::getsが削除されました。

+0

おそらくhttps://stackoverflow.com/questions/3203452/how-to-read-entire-stream-into-a-statstringに関連していますか? – lz96

+0

これはこれを行う正しい方法を示しています、私の質問は、C++が足で自分自身をそう簡単に撃たせることができる理由です。 – Lyberta

+0

@ M.M 'fgets'にはサイズパラメータがありますが、これはありません。 – Lyberta

答えて

1

さて、あなたが書き込みすることで、この場合、バッファオーバーフローを防ぐことができます。

s >> setw(sizeof c) >> c; 

だから私は、それはは足で自分を撮影するを使用することができますfgetsの場合、より似ていると思います正しく使用することができ、正しく使用すると完全に実行可能なオプションです。

私はそれを廃止するために本当に実行可能ではありませんoperator>>のこのオーバーロードを使用し、十分なライブコードがまだある予想される例:

void func(char *buf, size_t buf_len) 
{ 
    std::cin >> setw(buf_len) >> buf; 
} 

しかし、私のアドバイスは完全に配列を使用しないようになり、新たなコードを書くために(Cスタイルの配列、つまり)。代わりに、std::string、またはstd::array、またはバッファオーバーフローが発生しにくい他のコンテナを使用してください。

+0

'std :: array'を使ってここで何か変更する方法がわかりません –

+0

@MooingDuck' std :: istream'と 'std :: array'で' operator >> 'のオーバーロードが起こることを期待していました。 ..もしそうでなければ、そこにあるべきです:) –

+0

残念ながら、 'std :: string'と' std :: wstring'を除いて、C++コンテナにはそのようなオーバーロードがありません –

関連する問題