| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- msfconsole #heartbleed #247ctf #misc #webhacking
- androGoat
- 밴딧
- androidhacking
- sql injection
- 쿠키변조
- 취약점 진단
- error-based
- 안드로이드 모의해킹
- 리눅스
- Linux
- Bandit
- bandit #밴딧 #웹해킹 #해킹 #화이트해커 #공부 #스터디 #IT #hacking #linux #openssl #nmap
- pentest
- 모의해킹
- time-based
- Today
- Total
d0r1
[php] 기초 정리하기 본문
php란?
서버측 스크립트
내려받기 전 웹 서버에서 실행된다
내려받아서 확인할 때엔, HTML 코드만 노출되며, php 코드는 노출되지 않는다
키워드, 클래스, 함수, 사용자 함수 이름의 대소문자를 구문하지 않는다
장점
코드가 노출되지 않기 때문에, 보안성이 좋다
웹브라우저 버전 및 종류에 영향을 받지 않는다
단점
실시간 대응에 미흡하다
PHP 기초 구문 작성법
1. PHP 문법
1.1. 코드 영역
| 1. PHP 권장 스타일 : <?php ... ?> 2. HTML 스크립트 스타일 : <script language = "php"> ... </script> 3. SGML 스타일 : <? ... ?> 4. ASP 스타일 : <% ... %> |
php는 다음과 같은 태그를 이용하여, php의 시작과 끝이 어딘지 알려줄 수 있다.
html의 <html> </html> 처럼
<?php ~~~~~~~ ?>
안의 문장은 C언어와 동일하게 ;(세미콜론)으로 끝을 맺는다
그러나, 코드가 종료되면 자동으로 세미콜론을 적용해주기에, <?php echo"123" ?> 또한 정상적으로 작동한다.
또한, ?> 태그를 생략할 수 있다.
1.2. 주석
| 1. 한 줄 : // 2. 쉘 스타일로 한 줄 : # 3. 여러 줄 : /* */ |
PHP 주석은 줄의 끝이나, 코드 영역을 나타내는 종료 태그 중 먼저 나오는 부분까지만 주석으로 처리한다
그러므로, 종료 태그 후에 나오는 주석은 HTML 코드로 인식되어, 작동하게 된다.
1.3. echo()
printf의 개념을 생각하면 된다.
실제 함수가 아니기에, 인수를 전달할 때 괄호를 사용해도 되며, 생략할 수도 있다.
가변 길이 인수와 같이 함수 문맥으로는 사용할 수 없다.
또한, 두 개 이상의 인수를 전달할 시에는 괄호를 사용해서는 안된다.
2. PHP 기초
2.1. 변수
데이터를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간
C언어와 달리, 변수를 선언할 시, 타입을 명시하지 않는다
$(달러)를 표현하여 변수를 선언할 수 있다
| $var = value; |
| (생성규칙) 1. 변수의 이름은 영문 대소문자, 숫자, 언더바(_)로만 구성된다 2. 변수 이름은 숫자로 싲가할 수 없다 3. 공백이 포함되면 안된다 4. $this는 사용할 수 없다 5. 변수는 대소문자가 구별된다 |
문자열 내에서 변수를 사용하게 되면, PHP는 변수에 지정된 값으로 자동 변환해준다
이때 변수의 이름 뒤에 다른 문자가 오면, 변수의 이름을 정확히 인식하지 못한다
그러므로, {}(중괄호)로 변수의 이름을 감싸서, 어디까지가 변수의 이름인지 명시해야한다
[+] 그럼 "$"는 문자열로 못쓰나요?
\ "이스케이프"를 사용하여 표현할 수 있습니다
| $var = 10; echo "$var" --> 10 echo "{$var}" --> 10 echo "$varis10"--> error echo "\$var is $var" --> $var is 10 |
2.2. 변수의 초기 값
| 타입 | 기본값 |
| boolean | FALSE |
| int | 0 |
| float | 0.0 |
| string | NULL |
| array | NULL |
2.3. 변수의 종류
변수는 다음과 같이 구분한다
1. 지역 변수
2. 전역 변수
3. 정적 변수
2.3.1. 지역 변수
함수 내부에서 선언된 변수는 오직 함수 내부에서만 접근할 수 있다
또한, 함수 호출이 끝나면 메모리에서 제거된다
function calc() {
$a = 10; // local variable
$b = 20; // local variable
echo "{$a} {$b}" --> 10 20
}
calc();
echo "{$a} {$b}" --> 0 0
2.3.2. 전역 변수
함수 밖에서 선언된 변수는 함수 밖에서만 바로 사용할 수 있다
만약 함수 내에서 사용하고자 하면, global 키워드를 함께 써야한다
$var = 10; // global variable
function calc() {
echo "{$var}"; --> NULL
global $var;
echo "{$var}"; --> 10
}
calc();
echo "{$var}"; --> 10
2.3.3. 슈퍼글로벌
PHP는 미리 정의된 전역 변수인 슈퍼글로벌을 제공한다
특별한 선언 없이 스크립트 내의 어디에서나 사용할 수 있다
제공되는 슈퍼글로벌은 다음과 같다
| 1. $GLOBALS 2. $_SERVER 3. $_GET 4. $_POST 5. $_FILES 6. $_COOKIE 7. $_SESSION 8. $_REQUEST 9. $_ENV |
2.3.4. 정적 변수
함수 내부에서 static 키워드로 선언한 변수이다
함수 내부에서 선언된 정적 변수는 호출이 끝나도 메모리상에서 사라지지 않는다
지역 변수처럼 해당 함수 내부에서만 접근할 수 있다
function counter() {
static $count = 0;
echo "함수 내부에서 호출한 static 변수 count의 값은 {$count}입니다.<br>";
$count++;
}
counter(); 0
counter(); 1
counter(); 2
2.4. 상수 (constant)
변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미한다
그러나, 다른 점이라면, 스크립트가 실행되는 동안 그 데이터를 변경하거나 해제할 수 없다는 점이 다르다
2.4.1. define()
define()을 통해 상수를 선언할 수 있다
| define( 상수이름, 상숫값, 대소문자 구분여부 ) |
대소문자 구문여부의 경우, 기 본 값은 false로 대소문자를 구분한다
이렇게 선언된 상수는 스크립트 어디에서도 참조할 수 있다
그러나, 선언되기 전의 영역에서는 해당 상수를 참조 할 수 없다
2.4.2. 마법 상수
어떤 스크립트에서도 사용할 수 있는 미리 정의된 다양한 상수이다
| 상수 이름 | 설명 |
| __LINE__ | 파일의 현재 줄 번호를 반환 |
| __FILE__ | 파일의 전체 경로와 이름을 반환 include 내부에서 사용할 경우, include된 파일명을 반환 |
| __DIR__ | 파일 디렉터리를 반환 포함한 파일 안에서 사용할 경우 포함된 파일의 디렉터리를 반환 dirname(__FILE__)과 같은 결과를 반환 |
| __FUNCTION__ | 함수의 이름을 반환 |
| __CLASS__ | 클래스의 이름을 반환, 클래스 이름은 대소문자를 구분 |
| __TRAIT__ | 트레이트(trait)의 이름을 반환 트레이트의 이름은 트레이트를 선언한 네임스페이스를 포함 |
| __METHOD__ | 클래스의 메소드 이름을 반환 |
| __NAMESPACE__ | 현재 네임스페이스의 이름을 반환 |
function magicCons() {
echo __LINE__; // 파일의 현재 줄 번호를 반환함.
echo __FUNCTION__; // 함수의 이름을 반환함.
echo __METHOD__; // 클래스의 메소드 이름을 반환함.
}
magicCons();
2.5. 타입
2.5.1. 불리언
참과 거짓을 표현. 대소문자를 구분하지 않는다
만약 int(0), float(0.0), NULL 은 false로 인식된다.
그러나, 문자열 "false"는 빈 문자열이나 문자열 "0"은 아니기에, true로 인식된다
2.5.2. 정수
정수는 부호를 가지는 소수부가 없는 수를 의미한다
PHP에서 정수의 표현 범위를 운영체제에 따라 달라지며, 64비트를 기준으로는 -2^63~(2^63-1) 사이의 값을 가진다
PHP에서는 부호가 없는 정수(unsigned integer)는 지원하지 않는다
또한, 표현 방법에는 10진수(dec), 8진수(Oct--0), 16진수(hex--0x) 로 표현할 수 있다
만약, 정수의 최대 범위를 넘는 값이 대입되면, 그 변수는 자동으로 실수형(float)로 인식된다
echo "integer 타입의 크기는 ".PHP_INT_SIZE."바이트 입니다.<br>";
echo "integer 타입이 표현할 수 있는 가장 큰 수는 ".PHP_INT_MAX." 입니다.<br>";
$int_01 = 100;
var_dump($int_01);
echo "<br>";
$int_02 = PHP_INT_MAX; // integer가 표현할 수 있는 범위를 넘지 않는 값을 대입함.
var_dump($int_02);
echo "<br>";
$int_03 = PHP_INT_MAX + 1; // integer가 표현할 수 있는 범위를 넘는 값을 대입함.
var_dump($int_03);
----------------------------------------------------------------------------------
integer 타입의 크기는 8바이트 입니다.
integer 타입이 표현할 수 있는 가장 큰 수는 9223372036854775807 입니다.
int(100)
int(9223372036854775807)
float(9.223372036854776E+18)
2.5.3. 실수
소수부나 지수부를 가지는 수를 의미하며, 정수보다 더 넓은 표현 범위를 갖는다
실수의 표현 범위는 운영체제에 따라 달라지며, 대략 ~1.8e307까지 표현할 수 있다
그러나 컴퓨터에서는 실수형끼리 직접 값을 비교하는 것을 피하는게 좋다
e와 E는 모두 지수 표현이 가능하다
또한, 실수 범위를 넘는 값이 대입되면, 자동으로 정의된 상수인 INF로 인식된다
$float_01 = 3.14;
var_dump($float_01);
echo "<br>";
$float_02 = 1.23e-4;
var_dump($float_02);
echo "<br>";
$float_03 = 1.8E307; // float이 표현할 수 있는 범위를 넘지 않는 값을 대입함.
var_dump($float_03);
echo "<br>";
$float_04 = 1.8E308; // float이 표현할 수 있는 범위를 넘는 값을 대입함.
var_dump($float_04);
-----------------------------------------------------------------------
float(3.14)
float(0.000123)
float(1.8E+307)
float(INF)
2.5.4. 문자열
문자열은 "" 혹은 ''로 감싸서 표현할 수 있다
ASCII 인코딩 환경에서는 영문자는 한 글자당 1바이트, 한글으르 한 글자당 2바이트로 표현된다
UTF-8 인코딩에서는 영문자는 한 글자당 1바이트, 한글은 한 문자당 3바이트로 표현된다
$str_01 = "PHP";
$str_02 = "자바스크립트";
echo strlen($str_01)."<br>"; // 3
echo strlen($str_02); // 18
2.5.5. 배열
배열은 한 쌍의 키(KEY)와 값(VALUE)로 이루어진 맵(MAP)으로 구성되는 순서가 있는 집합을 의미한다
맵의 키 값으로는 정수와 문자열만이 가능하며, 하나의 배열에 두 가지 키 값을 같이 사용할 수 있다
만약 정수와 문자열 이외의 다른 타입의 값을 키로 사용하면, 내부적으로 다음과 같이 타입 변환이 이루어진다
불리언 true - 1, false - 0 으로 자동 타입 변환이 이루어진다
유효한 숫자로만 이루어진 문자열은 정수나 실수로 자동 타입 변환된다
실수는 소수 부분이 제거되며, 정수로 자동 타입 변환이 된다
NULL은 빈 문자열로 자동 타입 변환된다
배열과 객체는 배열의 키 값으로 사용할 수 없다
$arr = array(
1 => "첫 번째 값", // php의 배열에서 키값의 1과 "1"은 같은 값을 나타냄.
"1" => "두 번째 값", // 같은 키값을 사용하여 두 번 선언했기 때문에 나중에 선언된 "두 번째 값"만 남게됨.
10 => "세 번째 값",
-10 => "네 번째 값"
);
var_dump($arr);
echo "<br>";
echo $arr[1]."<br>";
echo $arr["1"]."<br>";
echo $arr[10]."<br>";
echo $arr[-10];
------------------------------------------------------
array(3) { [1]=> string(14) "두 번째 값" [10]=> string(14) "세 번째 값" [-10]=> string(14) "네 번째 값" }
두 번째 값
두 번째 값
세 번째 값
네 번째 값
2.5.6. 객체
클래스의 인스턴스를 저장하기 위한 타입이다
객체는 속성과 메소드를 포함할 수 있다
class Lecture
{
function Lecture()
{
$this->lec_01 = "PHP";
$this->lec_02 = "MySQL";
}
}
$var = new Lecture; // 객체 생성
echo $var->lec_01; // 객체의 속성 접근
echo "<br>";
echo $var->lec_02;
2.5.7. 리소스
PHP 외부에 존재하는 외부 자원을 의미한다
리소스는 데이터베이스 함수 등에서 데이터베이스 연결 등을 반환할 때 사용된다
2.5.8. NULL
오직 한 가지만을 가질 수 있는 특별한 타입
아직 어떠한 값도 대입되지 않은 변수를 의미
$var_01;
var_dump($var_01); // 초기화되지 않은 변수를 참조
echo "<br>";
$var_01 = 100; // $var_01 변수를 초기화함.
var_dump($var_01);
echo "<br>";
unset($var_01); // $var_01 변수를 삭제함.
var_dump($var_01); // 삭제된 변수를 참조
----------------------------------------------
NULL
int(100)
NULL
2.6. 타입 변환
2.6.1. 자동 타입 변환
앞서 말했듯, 변수를 선언할 때 타입을 명시할 필요가 없다
따라서, php의 타입 강도는 매우 약하며, 타입이 동적으로 결정된다
2.6.2. 강제 타입 변환
입력되는 값에 따라 타입이 변한다고 하였는데, 사용자가 직접 데이터의 타입을 변환해야하는 경우가 있다
이 경우에는 타입 캐스트의 연산자인 괄호()를 사용하여 수행할 수 있다
$var_01 = 10;
var_dump($var_01); // int(10)
$var_02 = (boolean) $var_01;
var_dump($var_02); // bool(true)
$var_03 = 0;
var_dump($var_03); // int(0)
$var_04 = (boolean) $var_03;
var_dump($var_04); // bool(false)
2.6.3. 가변 변수
변수의 타입만 아니라, 변수의 이름까지 동적으로 바꿀 수 있다
$PHP = "HTML";
$HTML = "CSS";
$CSS = "JavaScript";
$JavaScript = "Ajax";
$Ajax = "PHP";
echo $PHP; // HTML
echo $$PHP; // $HTML -> CSS
echo $$$PHP; // $$HTML -> $CSS -> JavaScript
echo $$$$PHP; // $$$HTML -> $$CSS -> $JavaScript -> Ajax
echo $$$$$PHP; // $$$$HTML -> $$$CSS -> $$JavaScript -> $Ajax -> PHP
echo $$$$$$PHP; // $$$$$HTML -> $$$$CSS -> $$$JavaScript -> $$Ajax -> $PHP -> HTML
echo $$$$$$$PHP; // $$$$$$HTML -> $$$$$CSS -> $$$$JavaScript -> $$$Ajax -> $$PHP -> $HTML -> CSS ...'이것저것 > 관심' 카테고리의 다른 글
| CVE-2025-55182 - React2Shell 취약점 분석 (0) | 2025.12.18 |
|---|---|
| infomation_schema가 필터링된다면 (0) | 2023.11.09 |
| m1 맥북에서 x86-64 ubuntu server 구현하기 + 포너블 환경 맞추기 (0) | 2023.10.19 |
| [MYSQL] 기초 구문 정리 (0) | 2023.10.16 |
| log4j (CVE-2021-44228) (0) | 2023.07.18 |