코드 문제 : 형식 문자열이 문자열 리터럴이 아닙니다.
중복 가능성 :
SnowLeopard Xcode 경고 : "형식이 문자열 리터럴이 아니고 형식 인수가 없습니다."
이 코드 줄에 대해 다음 문제가 발생합니다.
"형식 문자열이 문자열 리터럴이 아닙니다 (잠재적으로 안전하지 않음)."
NSLog([NSString stringWithFormat:@"%@", entered]);
어떤 제안?
컴파일러는 NSLog
잠재적으로 보안을 위반할 수있는 상당히 잘 알려진 악용을 방지하기 때문에 형식 문자열 (에 대한 첫 번째 인수 )에 대해 NSString 상수를 사용하기를 원합니다 . 예를 들어, 컴파일러를 행복하게 유지하기 위해 다음과 같이 게시 한 코드를 변경할 수 있습니다.
NSLog(@"%@", [NSString stringWithFormat:@"%@", entered]);
편집하다
물론 위의 내용은 다음과 같이 간단하게 작성할 수 있습니다.
NSLog(@"%@", entered);
보안 익스플로잇의 특성
제어되지 않는 형식 문자열 [1]은 1999 년경에 발견 된 일종의 소프트웨어 취약점으로 보안 악용에 사용될 수 있습니다. 이전에는 무해하다고 생각했던 형식 문자열 익스플로잇을 사용하여 프로그램을 중단하거나 유해한 코드를 실행할 수 있습니다. 문제는 .NET과 같은 형식화를 수행하는 특정 C 함수에서 형식 문자열 매개 변수로 확인되지 않은 사용자 입력을 사용하기 때문에 발생
printf()
합니다. 악의적 인 사용자는 무엇 보다도%s
및%x
형식 토큰을 사용 하여 스택 또는 메모리의 다른 위치에서 데이터를 인쇄 할 수 있습니다. 또한 스택에 저장된 주소에 형식화 된 바이트 수를 기록%n
하는 명령printf()
및 유사한 함수를 사용하여 임의의 위치에 임의의 데이터를 쓸 수도 있습니다 .일반적인 익스플로잇은 이러한 기술의 조합을 사용하여 프로그램이 라이브러리 함수의 주소 또는 스택의 반환 주소를 일부 악성 쉘 코드에 대한 포인터로 덮어 쓰도록합니다. 형식 지정자에 대한 패딩 매개 변수는 출력되는 바이트 수를 제어하는 데 사용되며
%x
토큰은 형식 문자열 자체의 시작 부분에 도달 할 때까지 스택에서 바이트를 팝하는 데 사용됩니다. 형식 문자열의 시작은%n
형식 토큰이 실행할 악성 코드의 주소로 덮어 쓸 수 있는 주소를 포함하도록 제작됩니다 .
출처 : Wikipedia 제어되지 않는 형식 문자열
[1] : http://cwe.mitre.org/data/definitions/134.html "CWE-134 : 제어되지 않는 형식 문자열". 일반적인 약점 열거. 연귀.
여기에 해결책이 있습니다.
경고 : "형식이 문자열 리터럴이 아니고 형식 인수가 없습니다."
시도
NSLog(@"%@",entered);
NSLog는 당신을 위해 포맷팅을 할 수 있기 때문에 ...
시험:
NSLog(@"%@",[NSString stringWithFormat:@"%@",entered]);
도움이 되었기를 바랍니다. :)
참조 URL : https://stackoverflow.com/questions/5428325/issue-with-code-format-string-is-not-a-string-literal
'programing' 카테고리의 다른 글
ASP.Net RadioButton 및 CheckBox가 Span 내부에서 렌더링되는 이유는 무엇입니까? (0) | 2021.01.16 |
---|---|
파이썬에서 '참'과 '거짓' (0) | 2021.01.16 |
문자열이 날짜인지 확인하는 기능 (0) | 2021.01.16 |
* ngFor를 사용하여 객체 키를 반복하는 방법 (0) | 2021.01.16 |
PHP의 고유하고 임시 파일 이름? (0) | 2021.01.16 |