일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Authentication
- over the wire
- Server Side Request Forgery
- THM
- Cookie
- BANDiT
- OS Command Injection
- tryhackme
- Reconnaissance
- active recon
- active reconnaissance
- file upload
- access control
- php login page
- sql injection
- privilege escalation
- FTZ
- SQLi
- overthewire
- Recon
- War Game
- php 파일 업로드하기
- php
- Leviathan
- 파일 업로드 취약점
- ssrf
- Cryptography
- php To Do List
- php file upload
- php 로그인 페이지 만들기
- Today
- Total
R's Hacking Daily Log
php 상수 다루기 본문
Step 1 :: 상수
이번에 알아볼 상수는 변수지만 변수가 아니다(?)
변수와 동일하게 어떤 값을 저장하는 역할로 쓰이지만 값을 한 번 지정한 순간부터 그 값을 수정할 수 없다.
변수를 선언하는 방법은 크게 두 가지가 있는 데, 첫 번째로 살펴볼 방법은 define 함수를 사용하는 것이다.
사용법은 간단하게 define 함수에 상수명 & 값을 넣으면 된다.
<?php
define('CONSTANT', 'hello<br/>');
function sayName() {
define('MYNAME', 'i am banana');
}
sayName();
echo CONSTANT;
echo MYNAME;
위의 코드에서는 총 2개의 상수가 만들어진 것을 볼 수 있다.
두 번째 줄에서 CONSTANT라는 이름의 "hello" 값을 갖는 상수와 sayName 함수 내부에서 만들어지는
MYNAME이라는 이름의 "i am banana" 값을 갖는 상수이다.
echo 함수를 사용해 상수 값을 출력해 보면 'hello' & 'i am banana' 문자열을 볼 수 있다.
두 번째 방법으로는 const를 사용하는 것이다.
<?php
const CONSTANT = "HELLO<br/>";
function msg() {
#const MESSAGE;
}
msg();
class MyClass {
public const MESSAGE = 'I am apple';
public static function foo() {
#const BYE;
}
}
echo CONSTANT;
echo MyClass::MESSAGE;
const로 상수를 만들기 위해서는 상수명 앞에 const keyword를 붙이면 된다.
위의 코드에서는 CONSTANT & MESSAGE라는 두 개의 상수를 만들고 있다.
코드가 실행되면 msg 함수, CONSTANT 출력, MyClass::MESSAGE 출력 순으로 진행된다.
msg 함수는 내용이 주석 처리되었기 때문에 아무런 동작도 하지 않는다.
const.php 결과에서 볼 수 있듯이 정상적으로 'HELLO' & 'I am apple' 문자열이 출력되었다.
여기서 의문이 들 수 있는 게 "msg 함수와 MyClass의 foo 함수 내용은 왜 주석처리 되어있을까"이다.
주석을 풀고 코드를 실행해보면 아래와 같은 결과가 출력된다.
define 함수를 사용해서 상수를 만드는 방법과는 달리 const는 함수 내부에서 사용할 수 없다.
그렇다 보니 함수 & 클래스 내의 메서드에서 const를 사용한 경우에는 에러가 나는 것이다.
Step 2 :: 매직 상수
메직 상수는 메타 정보를 갖는 상수를 의미한다.
메타 정보란 데이터에 대한 데이터라고 표현할 수 있는 데 함수와 변수를 갖는 클래스가 있다고 할 때,
클래스가 갖는 함수명이 어떻게 되는지, 클래스 명은 무엇인지와 같이
클래스 그 자체에 대한 정보를 메타 정보라고 생각하면 된다.
매직 상수의 한 가지 특징이라면 이름에 " __ "가 붙는 다는 것이다.
php code를 작성하는 tool에 " __ "를 입력해보면 아래와 같이 매직 상수에 어떤 것들이 있는지 확인해 볼 수 있다.
매직 상수를 이용한 예시를 살펴보자.
<?php
class A {
public function __construct()
{
echo __CLASS__;
}
public function sayHello() {
return __METHOD__;
}
}
$say = new A();
echo $say->sayHello();
코드의 전체 흐름은 [1]클래스 A를 만들고 [2]say라는 인스턴스 변수를 생성해 [3]sayHello 함수를 실행하는 것이다.
클래스 A에는 __construct 생성자와 sayHello 함수가 만들어져 있다.
(1) __construct 생성자는 __CLASS__ 값을 출력하는 역할이고
(2) sayHello 함수에서는 __METHOD__ 값을 반환한다.
(1) = A & (2) = A::sayHello의 결과가 예측대로 출력된 것을 확인할 수 있다!
(+) 개념 & 코드 설명
상수는 보통 대문자로 이름을 지정한다는 것을 Step 1 & 2에서 눈치챌 수 있을 것이다.
또한 상수는 프로그램 어디에서나 사용하기 위한 역할로 전역 범위를 갖는 다고 할 수 있다.
[ const.php code ]
<?php
const CONSTANT = "HELLO<br/>";
...
}
echo CONSTANT;
echo MyClass::MESSAGE;
echo MESSAGE; #추가된 코드
MESSAGE 상수를 출력하기 위해 사용한 MyClass::MESSAGE는
MyClass의 속성인 MESSAGE 값을 가리키는 형태로
클래스에서 선언된 상수를 마지막 줄처럼 상수명만 작성하면 에러가 발생하게 된다.
[ magic_constant.php code ]
<?php
class A {
public function __construct()
{
echo __CLASS__;
}
public function sayHello() {
return __METHOD__;
}
}
$say = new A();
echo $say->sayHello();
class keyword를 이용해 클래스를 만들고 나면 new keyword로 인스턴스를 생성할 수 있고
인스턴스가 갖는 함수는 인스턴스명->함수명 형태로 호출할 수 있다.
따라서 마지막 줄의 의미는 "say 인스턴스의 sayHello함수를 실행한 결과를 출력하라"는 것이다.
'PHP' 카테고리의 다른 글
php 연산자 다루기 (2) (0) | 2023.07.02 |
---|---|
php 연산자 다루기 (1) (1) | 2023.07.01 |
php 데이터 타입 (0) | 2023.06.30 |
php 변수 다루기 (2) (0) | 2023.06.29 |
php 변수 다루기 (1) (0) | 2023.06.29 |