%20%EC%95%88%EC%A0%84%ED%95%9C%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
LAMP 앱 프로그래밍을 시작한 이후로 나는 내 상자에 대한 관리 제어판을 개발하고 싶었습니다. (재미있고 교육적인 목적으로, 그렇지 않으면 이미 시장에 있는 것을 사용할 것입니다)
하지만 항상 저를 막았던 것은 exec() 함수(이것을 달성하기 위해 제가 아는 유일한 방법)가 해롭다는 말을 항상 들었다는 것입니다.... 아시다시피 "사용하지 마세요", "잘못된 코딩입니다" 등이 있습니다.
내가 결코 듣지 못한 것은 그 목적에 대한 더 안전한 대안이므로 내 질문은 다음과 같습니다.
있어요?
비밀번호로 보호된 문서 루트를 사용하여 전용 웹 서버에서 해당 앱을 실행하는 것만으로는 충분하지 않습니까?
글쎄요, 그게 제 의심이에요.
답변1
내 생각에 실제 위험은 사용자의 입력을 다음 중 하나로 혼합하는 것입니다 exec()
. 여기에서 대부분의 위험이 발생합니다. 사용자가 CLI에 혼합하면 ;
텍스트 상자에 세미콜론( )을 삽입하고 그 뒤에 추가 명령을 실행하는 등 위험한 작업을 수행할 수 있는 입력을 제공할 수 있기 때문입니다. 인수를 제공했습니다.
따라서 일반적으로 읽기 전용 방식으로 명령을 실행하는 것은 다른 작업을 수행하는 것보다 더 이상 위험하지 않습니다.
이는 기본적으로 SQL 주입 공격과 동일한 문제이며, 여러분에게 더 익숙할 것입니다.
답변2
내가 아는 한(그리고 나는 실제로 프로그래머가 아니므로 약간의 오해를 불러일으키십시오) exec()
호출은 전혀 악한 것이 아닙니다. 단지 새로운 프로세스를 포크하고 시스템 기능을 호출하기 때문에 오버헤드가 높다는 것입니다. 일반적으로 사람들은 작성 중인 프로그램/스크립트에서 내부적으로 작업을 수행하고 exec()
.
그러나 목표가 시스템에서 명령을 실행하는 것이라면 그러한 호출 없이는 이를 수행할 방법이 없습니다. 물론 보안 위험이 있으므로 임의의 사용자가 서버에서 임의의 명령을 실행하도록 허용하면 문제가 발생합니다. 그러나 이 서버에 대한 접근이 엄격하게 제한되어 있는 경우에는 안전하게 할 수 있을 것입니다.
어쨌든 주요 결론은 exec()
기능이 본질적으로 나쁜 것은 아니며 내부적으로 무언가를 수행하는 것보다 효율성이 떨어지는 경향이 있다는 것입니다.