ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  276  : 記事  5  : コメント  584  : トラックバック  68

ニュース

あわせて読みたい

記事カテゴリ

書庫

日記カテゴリ

Communities

上記で話題になった記事ですけど、他のも覗いてみた。

C/C++のデータ型と書式を知る:入力の書式

    #include <STDIO.H>
      ..........
    char a[11];            /* 半角10文字分の文字列を保持する変数(配列) */
    scanf( "%s", a );      /* 変数aに文字列を入力 */
    printf( "%s\n", a );   /* 変数aの値を出力 */

おい! scanf って教える必要がある?教えるなら、fgets でしょう。

 char buffer[11];
 fgets(buffer, sizeof(buffer), stdin);
 printf("%s\n", buffer);

慣れている人ならば、sscanf も加えるかもね。

 char buffer1[11];
 char buffer2[11];
 fgets(buffer1, sizeof(buffer1), stdin);
 sscanf(buffer1, "%s", buffer2);
 printf("%s\n", buffer2);

なぜ scanf を使わないか?というと buffer overflow する可能性があるから。元記事の sample 11文字以上の入力があった場合には、buffer overflow します。
これ見て C 覚えようとしている人どうなるんだろ?Bug の発生だけでなく脆弱性にもなるんですけど。
初心者にわかりやすく解説したいというのはわかります。でも、脆弱性が絡む部分は後から教えるではダメだと思う。脆弱性が発生する原理は後追いで解説するのはかまわないとしても、脆弱性を生む要因を教える時に脆弱性を回避する方法を一緒に教えないと。もしくは脆弱性が発生しない方法のみ教える。

どうしても scanf を使って簡単に説明したいというなら、書式指定文字で size を制限する。

 char buffer[11];
 scanf("%10s", buffer);
 printf("%s\n", buffer);

次の page に書式指定文字の解説が書いてあるんですが、説明ないですねぇ。

投稿日時 : 2008年3月29日 22:30

コメント

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/29 22:49 774RR
まあねぇ gets みたいなのがいまだに標準関数だしねー
俺も scanf は教えません(というか、使いこなす自信がつくまで使っちゃだめと教えます)

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/29 22:50 n
>char a[11]; /* 半角10文字分の文字列を保持する変数(配列) */

半角10文字ですか・・・語弊なような

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/29 22:53 ちゃっぴ
> 次の page に書式指定文字の解説が書いてあるんですが、説明ないですねぇ。

その前の記事でおせーてました。制限しない理由いみふめー。

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/29 23:06 Jitta
> 半角
おもた
けど、突っ込む気にはなれなんだ
あまりにもグダグダすぎて

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 0:34 はつね
buffer overflow教えるために教えるとか、半角10文字という意味が何を意味するのか教えるために教えるとか、「ほらコンピュータってこんなに簡単に意図した動きとは違うことをやるんだ。でもそれはこちらがそう指示してるからですね」とかいう感じで意外な例としてとりあげるかでしょうか。


# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 2:10 はつね
コメントせずにはいられなくなってID登録したけれど、気の毒すぎて[投稿]ボタンをクリックするのを躊躇中


# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 8:37 スーパーあんどちん
ここでも
#include ファイル名無し
書いてるなぁ

これを一々書く意味が分からない。


# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 13:53 774RR
< がタグに解釈されただけと解説しとこう
HTMLソースを表示して味噌

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 14:59 スーパーあんどちん
そーだったんですか。納得しました。
でもそれって、チェックしてないって事ですね。


# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 15:59 ちゃっぴ
ここの blog の仕様で自動変換かかってしまうんです。

&lt; → <, &gt; → >

ちなみに元記事も source 内に書かれていますよ。

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 16:43 スーパーあんどちん
僕が気にしてたのは元記事の方なので、こっちは気にしてませんでしたけど。
# 単にコピペしただけだと思ってたので。

個人的に標準ヘッダ名は小文字で書くのが好き。


# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 19:59 ma2
scanfの書式に%10sと書くとどうなるんだっけ? と悩んだのはここだけの秘密ですwww
# 10文字+'\0'で以降破棄なんでしたっけ?

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/03/30 22:00 ちゃっぴ
> # 10文字+'\0'で以降破棄なんでしたっけ?

です。

MS の解説がよさげですね~。

scanf 関数の文字幅指定
http://msdn2.microsoft.com/ja-jp/library/xdb9w69d.aspx

scanf、_scanf_l、wscanf、_wscanf_l
http://msdn2.microsoft.com/ja-jp/library/9y6s16x1.aspx

# scanfを使うなら 2008/04/02 13:09 DHJJ [Hatsune's Journal Japan]
scanfを使うなら

# 実態が切れてないorz 2008/04/02 13:11 がるの健忘録
実態が切れてないorz

# [プログラム]scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/04/02 13:16 愚者のニュース
[プログラム]scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう)

# re: scanf って教える必要ある?(初心者に教えるときでも最初から脆弱性が発生しない方法を教えよう) 2008/04/05 1:10 ちゃっぴ
> 本連載には技術的な誤りが存在するため、各回の詳細をレビュー中です。
> 読者の皆様には引き続き、コメントなどでご意見を頂けましたら幸いです。

との announce がありました。

Post Feedback

タイトル
名前
Url:
コメント