どちらもバッファをオーバーフローさせる可能性があるように思われます。それでも、gets()は絶対に使用しないことをお勧めしますが、scanf()を使用することをお勧めします。
scanf()で許可されているフォーマット引数が原因ですか、それとも他の理由がありますか?
どちらもバッファをオーバーフローさせる可能性があるように思われます。それでも、gets()は絶対に使用しないことをお勧めしますが、scanf()を使用することをお勧めします。
scanf()で許可されているフォーマット引数が原因ですか、それとも他の理由がありますか?
このgets
関数は、バッファオーバーフローから保護されていません。
フォーマット文字列を使用scanf
すると、標準入力から読み取り、指定されたメモリバッファに格納する文字列の最大長を定義できます。たとえばscanf("%10s\n", str);
、最大10文字で読み取られます。str
NULL終了文字を格納するには、バッファを11バイトにする必要があります。
scanf
パフォーマンスに関しては、のバッファオーバーフローの問題を回避するためだけに使用する場合はgets
、fgets
代わりに関数を使用することをお勧めします。
バッファのサイズよりも多くの文字を入力でき、gets()はそれを喜んで許可するからです。さらに、gets()は非推奨になりました(C11で)。そのため、scanf()との比較は無効になります。さらに、scanf()には、フォーマットされていないデータを処理するときに独自の問題があります。
したがって、より良いオプションはfgets()であり、必要に応じて処理します。
それでもscanf()を使用することをお勧めします。
「scanfsecurity」をグーグルですばやく検索すると、最大212kの結果が得られます。1つ目はウィキペディアで、次のように述べています。
長さ指定子のないプレースホルダーの使用は、
%s
本質的に安全ではなく、バッファーオーバーフローに悪用されます。
scanf
したがって、Web上のセキュリティに関する十分な情報があります。との違いgets
は、scanf
安全に使用できることですが、使用することgets
は事実上常に悪い考えです。
バッファオーバーフローを防ぐ方法がないからです。最大バッファ長が指定されているため、fgetsの方が安全です。
gets
入力の形式が正しくない場合、バッファオーバーフローを防ぐことはできません。scanf
読み取るデータ量を制御できます。
get()の名目上のタスクは、ストリームから文字列を読み取ることです。発信者は、着信文字を配置する場所を指示します。ただし、gets()はバッファスペースをチェックしません。呼び出し元がスタックへのポインターを提供し、バッファースペースよりも多くの入力を提供した場合、gets()はスタックを上書きします。ほとんどのシステムは、スタックの中央にある既存のエントリをより大きなもので上書きすることに対して脆弱であり、隣接するエントリも上書きします。マレファクターは、引数文字列に正しいバイナリパターンを格納することにより、スタック上のプロシージャアクティベーションレコードのリターンアドレスを修正できます。これにより、実行フローが元の場所に戻るのではなく、execv()を呼び出して実行中のイメージをシェルに置き換える特別な命令シーケンスに迂回します。このシェルは、ウイルスのコピーを横切ってシステムにドラッグするコマンドを発行できます。したがって、gets()は安全ではありません。