プロが教えるわが家の防犯対策術!

下記サイト記事の一つ目の例についてです。
https://www.jpcert.or.jp/sc-rules/c-fio30-c.html

違反コードでは、fprintf関数を使用しており危険、適合コードはfputs関数で回避とありますが、ユーザーからの入力を元にした文字列msgをsnprintfで構築しているのは両方とも変わりませんが、それを書式文字列として扱うかどうかによって件名の関数の危険有無が変わるというのがいまいち分かりません。
ユーザーの危険な入力を何か一例として、解説をお願い出来ないでしょうか?

A 回答 (3件)

例えば、ユーザー入力(mgs)が "%s%s"



fprintf(stderr, msg);
なんて実行したらたいてい落ちます。

%sに対応するパラメー夕(文字列のポイン夕)をパラメー夕スタックから読みますが、与えていないので不正値を読み、それを使って文字列を読み取ろうとして、たいていは不正メモリアクセスになります。
    • good
    • 0

>それを書式文字列として扱うかどうかによって件名の関数の危険有無が変わるというのがいまいち分かりません。


危険性についてはNo1さんの回答に1票。
個人的には、fputs関数で回避するのではなく、
 fprintf(stderr, msg);
を、書式文字列 と 出力文字列をちゃんと分離して
 fprintf(stderr, "%s", msg); 
とすればよいだけのことと思います。
    • good
    • 0

ユーザーが入力したパスワードに、%sや%fが含まれていると、msgバッファーに、%sや、%fが含まれてしまうので、



fprintf(stderr, msg);

で、おかしな動作をしてしまいます。なので、fputs()で、ただの文字列として出力してくださいということだと思います。
    • good
    • 3

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています