programing

코드 문제 : 형식 문자열이 문자열 리터럴이 아닙니다.

sourcetip 2021. 1. 16. 11:18
반응형

코드 문제 : 형식 문자열이 문자열 리터럴이 아닙니다.


중복 가능성 :
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

반응형