2012-04-01 20 views
8

Tôi đang khởi tạo một chuỗi có thể thay đổi và sau đó ghi lại nó như sau.Tại sao chuỗi của tôi có khả năng không an toàn trong ứng dụng iOS của tôi?

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

Các công trình mã và chạy, nhưng tôi nhận được một cảnh báo lạ (màu vàng):

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

Tại sao?

+0

Lỗi định dạng phát sinh do đối số của C không vượt qua loại an toàn. –

Trả lời

10

Vâng, có một vài vấn đề ở đây.

Đầu tiên (và không phải là câu hỏi mà bạn đã hỏi) là bạn đang phân bổ một NSMutableString mới và sau đó chỉ cần vứt nó đi trong dòng thứ hai khi bạn đặt nó thành someTextFieldIbOutlet.text. Ngoài ra, bạn đang truyền một chuỗi không thể thay đổi thành một chuỗi có thể thay đổi mà sẽ không thực sự hoạt động. Thay vào đó, kết hợp hai dòng đầu tiên như thế này:

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

Các lỗi thực tế rằng bạn đang nhận được gây ra bởi vì đối số đầu tiên để NSLog được coi là những "định dạng" chuỗi mà nói NSLog cách bạn muốn định dạng dữ liệu sau trong các đối số sau. Đây phải là một chuỗi chữ (được tạo ra như @"this is a literal string") để nó không thể được sử dụng để khai thác chương trình của bạn bằng cách thay đổi nó.

Thay vào đó, sử dụng này:

NSLog(@"%@", mStr); 

Trong trường hợp này, chuỗi định dạng là @"%@" có nghĩa là "Tạo một đối tượng NSString thiết lập để %@". %@ có nghĩa là đối số tiếp theo là đối tượng và thay thế %@ bằng mô tả của đối tượng (trong trường hợp này là giá trị của chuỗi).

+0

tại sao nó có khả năng không an toàn? – Claudiu

6

Nếu mStr được đặt thành một cái gì đó như %@, NSLog sẽ cố gắng tải một đối số đối tượng, không thành công và có thể bị lỗi nghiêm trọng. Có các chuỗi định dạng khác cũng có thể gây ra sự tàn phá.

Nếu bạn cần chỉ cần đăng nhập một chuỗi mà không cần bất kỳ văn bản đánh dấu, sử dụng:

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

mStr bạn đang chuyển được sử dụng để định dạng. Nếu chuỗi này đến từ một nguồn không đáng tin cậy, nó có thể được sử dụng để exploit your program nếu kẻ tấn công cung cấp một số đầu vào được viết chính xác.

Bạn nên thay đổi mã của bạn để:

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

Bằng cách này, không có vấn đề gì nội dung được lưu trữ trong mStr, nó không thể được sử dụng bởi một kẻ tấn công khai thác chương trình của bạn.

Đây là vấn đề bảo mật nghiêm trọng; từ kho lưu trữ cục bộ của tôi là CVE database, tôi đã đếm 520 trường hợp lỗ hổng chuỗi định dạng từ năm 1999 đến đầu năm 2012.

+0

@ lnafziger: cảm ơn bạn đã sửa chữa. – sarnold

+0

+1, nhờ url wikipedia. –

Các vấn đề liên quan