6

どちらもバッファをオーバーフローさせる可能性があるように思われます。それでも、gets()は絶対に使用しないことをお勧めしますが、scanf()を使用することをお勧めします。

scanf()で許可されているフォーマット引数が原因ですか、それとも他の理由がありますか?

4

6 に答える 6

10

このgets関数は、バッファオーバーフローから保護されていません。

フォーマット文字列を使用scanfすると、標準入力から読み取り、指定されたメモリバッファに格納する文字列の最大長を定義できます。たとえばscanf("%10s\n", str);、最大10文字で読み取られます。strNULL終了文字を格納するには、バッファを11バイトにする必要があります。

scanfパフォーマンスに関しては、のバッファオーバーフローの問題を回避するためだけに使用する場合はgetsfgets代わりに関数を使用することをお勧めします。

于 2013-03-13T16:19:28.473 に答える
2

バッファのサイズよりも多くの文字を入力でき、gets()はそれを喜んで許可するからです。さらに、gets()は非推奨になりました(C11で)。そのため、scanf()との比較は無効になります。さらに、scanf()には、フォーマットされていないデータを処理するときに独自の問題があります。

したがって、より良いオプションはfgets()であり、必要に応じて処理します。

于 2013-03-13T16:19:30.917 に答える
1

それでもscanf()を使用することをお勧めします。

「scanfsecurity」をグーグルですばやく検索すると、最大212kの結果が得られます。1つ目はウィキペディアで、次のように述べています。

長さ指定子のないプレースホルダーの使用は、%s本質的に安全ではなく、バッファーオーバーフローに悪用されます。

scanfしたがって、Web上のセキュリティに関する十分な情報があります。との違いgetsは、scanf安全に使用できることですが、使用することgetsは事実上常に悪い考えです。

于 2013-03-13T16:22:13.123 に答える
1

バッファオーバーフローを防ぐ方法がないからです。最大バッファ長が指定されているため、fgetsの方が安全です。

于 2013-03-13T16:17:13.953 に答える
1

gets入力の形式が正しくない場合、バッファオーバーフローを防ぐことはできません。scanf読み取るデータ量を制御できます。

scanfがCでバッファオーバーフローを引き起こすのを防ぐ方法は?

于 2013-03-13T16:20:35.943 に答える
1

get()の名目上のタスクは、ストリームから文字列を読み取ることです。発信者は、着信文字を配置する場所を指示します。ただし、gets()はバッファスペースをチェックしません。呼び出し元がスタックへのポインターを提供し、バッファースペースよりも多くの入力を提供した場合、gets()はスタックを上書きします。ほとんどのシステムは、スタックの中央にある既存のエントリをより大きなもので上書きすることに対して脆弱であり、隣接するエントリも上書きします。マレファクターは、引数文字列に正しいバイナリパターンを格納することにより、スタック上のプロシージャアクティベーションレコードのリターンアドレスを修正できます。これにより、実行フローが元の場所に戻るのではなく、execv()を呼び出して実行中のイメージをシェルに置き換える特別な命令シーケンスに迂回します。このシェルは、ウイルスのコピーを横切ってシステムにドラッグするコマンドを発行できます。したがって、gets()は安全ではありません。

于 2013-03-13T16:27:09.347 に答える