반응형
Web Development · PHP
PHP 백틱 —
` 셸 명령 실행
PHP 안에서 운영체제 명령을 실행하고 결과 받기
시작 오늘 분석할 코드
리눅스/Mac의 ls -laF로 현재 디렉토리 파일 목록을 가져와 화면에 출력한다. PHP는 백틱(`)으로 셸을 직접 실행할 수 있다.
<?php $filelist = `ls -laF`; // $filelist = `dir`; // Windows의 경우 print "<PRE>"; print $filelist; print "</PRE>"; ?>
가능한 출력 예 (실제로는 시스템마다 다름)
total 24 drwxr-xr-x 3 user staff 96 Apr 30 12:00 ./ drwxr-xr-x 8 user staff 256 Apr 30 11:50 ../ -rw-r--r-- 1 user staff 300 Apr 30 12:00 operators8.php* -rw-r--r-- 1 user staff 150 Apr 30 11:55 index.html drwxr-xr-x 2 user staff 64 Apr 30 11:30 images/
용어 핵심 키워드
` ` (백틱)감싼 문자열을 셸 명령으로 실행
shell_exec()백틱과 동일 기능 — 명시적 함수
exec()실행 + 종료코드 받기
system()실행 + 직접 출력
<PRE>고정폭 폰트 + 공백/줄바꿈 보존
보안 위험⚠ 사용자 입력으로 셸 실행은 절대 X
1 백틱이란?
백틱(`)은 키보드의 ESC 옆 키 (~ 와 같이 있음). 이 기호 두 개로 감싼 문자열을 PHP는 셸 명령으로 실행하고 그 결과 문자열을 반환한다.
// 두 코드는 같은 결과 $result = `ls -la`; $result = shell_exec("ls -la");
2 셸 명령은 OS마다 다르다
- Linux/Mac:
ls -laF,pwd,whoami - Windows:
dir,cd,echo
본 코드의 ls는 Linux/Mac용. Windows 서버라면 dir로 바꿔야 한다.
3 <PRE> 태그가 필요한 이유
ls의 출력에는 여러 공백과 줄바꿈이 있다. 일반 HTML은 공백을 합치고 \n을 무시한다. <pre> 태그로 감싸면 공백/줄바꿈 그대로 보존된다.
- 고정폭 폰트로 표시 — 줄이 정렬돼 보임
- 여러 공백을 그대로 유지 — 표 정렬 깨지지 않음
- 줄바꿈(\n)이 화면에서도 줄바꿈으로 보임
반응형
4 보안 — 절대 사용자 입력을 그대로 X
⚠ 최악의 보안 취약점 — 사용자 입력을 검증 없이 백틱에 넣으면 임의 코드 실행 (RCE) 공격에 노출된다.
// ❌ 절대 하지 말 것 $file = $_GET['name']; $out = `cat $file`; // 사용자가 ?name=foo;rm -rf / 보내면 → 서버 파일 삭제 // ✅ 입력 검증 필수 $file = basename($_GET['name']); if (!preg_match('/^[a-z0-9_.-]+$/', $file)) { die("Invalid filename"); } $out = `cat /var/data/$file`;
5 4가지 셸 실행 함수
// 1) 백틱 — 결과만 받음 $out = `ls`; // 2) shell_exec — 백틱과 동일 (명시적) $out = shell_exec("ls"); // 3) exec — 결과를 배열로 + 종료코드 exec("ls", $lines, $code); // 4) system — 결과를 직접 출력 system("ls"); // print 없이도 화면에 나옴
6 자주 하는 실수 / 주의
- php.ini의 disable_functions — 보안상 백틱과 shell_exec이 비활성화된 호스팅이 많음
- safe_mode (PHP 5.3까지) — 같은 이유로 차단
- 웹 서버 사용자 권한 — Apache의 사용자(보통 www-data)로만 실행 가능
- 경로 명시 —
/usr/bin/ls처럼 절대 경로가 안전 - OS 의존 코드는 이식성 ↓
7 더 안전한 대안
대부분의 경우 PHP 자체 함수로 같은 일을 할 수 있다.
// ❌ 셸 ls $files = `ls /home/user`; // ✅ PHP 함수 — OS 독립, 안전 $files = scandir("/home/user"); // 또는 glob, FilesystemIterator 등
핵심 한 줄 요약
` ` (백틱)셸 명령 실행 + 결과 반환
shell_exec()동일 기능 — 명시적
<pre>셸 출력 정렬 보존
OS 의존ls(Linux) vs dir(Win)
보안 위험사용자 입력 절대 X
안전한 대안scandir / glob / 자체 PHP 함수
호스팅 차단disable_functions로 막힘 흔함
Tags
#PHP #백틱 #shell-exec #셸명령 #보안위험 #scandir #glob #disable_functions #시스템호출 #백엔드 #CSS #HTML #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, 백틱, shell-exec, 셸명령, 보안위험, scandir, glob, disable_functions, 시스템호출, 백엔드, CSS, HTML, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP 연관 배열 — 키 한 개 시작 완전 정리 (0) | 2026.06.26 |
|---|---|
| PHP 배열 변수 선언 — array() 한 줄 완전 정리 (0) | 2026.06.26 |
| PHP 오류 제어 연산자 — @ 완전 정리 (0) | 2026.06.26 |
| PHP 비트 AND 연산자 — & 완전 정리 (0) | 2026.06.26 |
| PHP 참/거짓 — true, false, == 완전 정리 (0) | 2026.06.26 |
왕진 블로그

댓글