2012-04-01 21 views
8

私は変更可能な文字列を初期化して、次のようにロギングしています。iOSアプリケーションで文字列が安全でない可能性があります。

Format string is not a string literal (potentially insecure). 

理由:

NSMutableString* mStr = [[NSMutableString alloc] init]; 
mStr = (NSMutableString*) someTextFieldIbOutlet.text; 
NSLog((NSString *) mStr); 

コードの動作と実行されますが、私は(黄色で)奇妙な警告を取得していますか?

+0

Cの引数渡し規則は型保護されていないため、バグが発生します。 –

答えて

10

まあ、いくつかの問題がここにあります。

最初の1つは、あなたが新しいNSMutableStringを割り当てて、それをsomeTextFieldIbOutlet.textに設定したときに2行目に投げ捨てることです。また、変更不可能な文字列を実際には動作しない変更可能な文字列にキャストしています。 NSLogへの最初の引数をフォーマットしたいかのNSLogを告げる「フォーマット」の文字列ことになっているので、あなたが取得している実際のエラーが原因で発生し

NSMutableString* mStr = [NSMutableString stringWithString:someTextFieldIbOutlet.text]; 

:代わりに、このような最初の2行を結合後の議論に続くデータ。これは、リテラル文字列(@"this is a literal string"のように作成されている)でなければなりません。そのため、プログラムを変更して悪用することはできません。代わり

は、この使用:ここで

NSLog(@"%@", mStr); 

を、書式文字列は "%@に設定NSStringオブジェクトを作成する" を意味する@"%@"あります。 %@は、次の引数がオブジェクトであることを意味し、%@をオブジェクトの説明(この場合は文字列の値)に置き換えます。

+0

なぜそれは潜在的に安全ではありませんか? – Claudiu

6

%@のように設定されている場合、NSLogはオブジェクト引数をロードしようとしますが、失敗し、おそらくひどくクラッシュします。混乱の原因となる他の書式文字列もあります。

あなただけの任意のマーカーテキスト、使用せずに文字列をログに記録する必要がある場合:

NSLog(@"%@", mStr); 
6

あなたが渡しているmStrは、書式設定に使用されます。この文字列が信頼できないソースから来た場合、攻撃者が正しく書き込まれた入力をいくつか提供している場合は、exploit your programに使用できます。

あなたがあなたのコードを変更する必要がありません:mStrに格納されてどのようなコンテンツに関係なく、

NSLog(@"%@", (NSString *) mStr); 

この方法は、あなたのプログラムを悪用する攻撃者によって使用することはできません。

これは深刻なセキュリティ上の問題です。 CVE databaseのローカルアーカイブから、1999年から2012年の間にフォーマット文字列の脆弱性が520件計数されました。

+0

@lnafziger:修正していただきありがとうございます。 – sarnold

+0

+1、wikipediaのURLに感謝します。 –

関連する問題