mikecat_mixc mikecat_mixc 2013-10-06 23:12:09

[C] 油断大敵 このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

入力文字列がパスワードとして適切か判定したかったのですが・・・

「あれ?なんで通らないんだ?」
・・・
「アッーーー!」

もしこれを本番でやらかしていたら、確実に人権を失いますね・・・

(コメントは投稿用に付け足しました)

#include <stdio.h>
#include <ctype.h>

int main(void) {
	char password[32];
	int i;
	int check=0;
	scanf("%s",password);
	for(i=0;password[i];i++) {
		if(isalpha(password[i]))check|=1; /* 数字が含まれているか判定したい */
		if(isupper(password[i]))check|=2; /* 大文字英字が含まれているか判定したい */
		if(islower(password[i]))check|=4; /* 小文字英字が含まれているか判定したい */
	}
	printf("%sVALID\n",(i>=6 && check==7)?"":"IN");
	return 0;
}

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(8)

#1 jkr_2255 jkr_2255 2013-10-07 20:49:32  

長い長いパスワードでバッファオーバーラン?

#4 c_9_l c_9_l 2013-10-17 10:17:19  

三項演算子じゃなくて(リンク先を見てませんでした)原因はisalphaか。 数値が無くても通ってしまうと。

#5 m_shige1979 m_shige1979 2013-10-19 10:29:58  

c言語ってメモリの割り当てが厄介だから内部初期化は必須だよね

#6 c_9_l c_9_l 2013-11-09 15:09:56  

1文字以上20文字以内と書いてあるので今回の場合は大丈夫ではないのでしょうか?

・数値【でなかった】ら1のビットフラグON
・大文字だったら2のビットフラグON
・小文字だったら4のビットフラグON

#7 jkr_2255 jkr_2255 2014-01-10 19:16:26  

競技プログラミングや自分専用のツールなら入力要件に完全依存でもいいけど、実用的なプログラムを書く場面では、悪意やバグによる異常入力も考えておかないといけないのは間違いない。

#8 utubyou009 utubyou009 2017-07-25 03:38:49  

scanf のフォーマットで ”%s” は危険。

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[C] 殺意を覚えたコメント

このエントリーをはてなブックマークに追加

このコメントを書いた人はこの職業に向いて...

/*  よくわからないからNULL  */
foo( NULL );

鑑賞する »

[C] NULL と 8 の何故

このエントリーをはてなブックマークに追加

テストは通ってるけど、教科書からやり直し...

#define TO_STRING(n, str) \
  if(n != N...

鑑賞する »

[C] switch-caseは現場の臭いがする

このエントリーをはてなブックマークに追加

"とりあえず"で書いた 2010 年 4...

// switch-case にしたいが、関数で値を取得しないといけないため、
...

鑑賞する »