2013-02-04 47 views
6

可能重複:
Why is my string potentially unsecure in my iOS application?格式字符串不是一個字符串(可能不安全)

新的編譯器警告,因爲升級的XCode 4.6:

Format string is not a string literal (potentially insecure)

最小的例子展示兩者的警告最後行:

for (NSUInteger i = 0; i < 10; i++) { 
    NSString *res = [testInstance generate:i]; 
    NSString *desc = [NSString stringWithFormat:@"TestData: %d", i]; 
    STAssertNotNil(res, desc); 
    STAssertNotEquals(@"", res, desc); 
    } 

我看着它關注此警告其他的問題,但他們不必要地使用stringWithFormat:程序員幹 - 在這裏我想有一個動態的斷言描述每次迭代而改變,但不是每個檢查。

我可以將格式字符串和數據傳遞給斷言,但我必須獨立維護描述。

如果我需要在描述的格式中使用日誌消息或斷言調用之前,我該如何避免此警告?

+0

需要注意的是,'stringWithFormat'將在每次迭代中被評估,而如果您將格式字符串放入斷言中,則只有斷言失敗時纔會評估它。 –

回答

4

問題是斷言中的非文字格式字符串。將它們更改爲:

STAssertNotNil(res, @"%@", desc); 
STAssertNotEquals(@"", res, @"%@", desc); 

格式化字符串是一個常見的安全問題。當它們對編譯器不可見時,它不能檢查它們。在你的情況下,他們已被隱藏在desc

+0

你能詳細說明一下嗎?如果編譯器不能檢查它們,它如何是一個安全問題? – ArtOfWarfare

+1

@ArtOfWarfare Printf樣式格式字符串是常見的安全漏洞。當格式字符串參數不是常量時,攻擊者可以注入僞造的格式字符串,將任意數據寫入用於打印的緩衝區之外的存儲器位置。請參閱http://en.wikipedia.org/wiki/Uncontrolled_format_string –

相關問題