일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- php file upload
- php
- BANDiT
- FTZ
- 파일 업로드 취약점
- OS Command Injection
- sql injection
- file upload
- ssrf
- Cryptography
- Reconnaissance
- privilege escalation
- php 파일 업로드하기
- Recon
- overthewire
- active reconnaissance
- access control
- php login page
- active recon
- Leviathan
- over the wire
- Server Side Request Forgery
- THM
- Authentication
- php To Do List
- Cookie
- tryhackme
- SQLi
- War Game
- php 로그인 페이지 만들기
- Today
- Total
R's Hacking Daily Log
php 연산자 다루기 (2) 본문
Step 5 :: 논리 연산자
논리 연산자는 논리식을 판단하여 True OR False 둘 중 하나로 결과를 반환하는 연산자이다.
종류는 and, or, xor, not 연산자가 있다.
<?php
$a = true;
$b = false;
echo "a and b는".($a and $b)."<br/>";
echo "a && b는 ".($a && $b)."<br/>";
and 논리 연산자는 피연산자의 값이 둘 다 True일 때만 True를 반환한다.
코드에서 a & b는 서로 true & false로 다른 값을 같기 때문에 False가 반환될 것이다.
and 논리 연산을 실행하기 위해서는 [ and 또는 && ]를 입력하면 된다.
echo "a or b는 ".($a or $b)."<br/>";
echo "a || b는 ".($a || $b)."<br/>";
or 논리 연산자는 피연산자의 값 중 하나만 True여도 True를 반환한다.
a와 b는 서로 다른 논리값을 갖기 때문에 논리 연산의 결과는 True가 나온다.
or 논리 연산을 실행하기 위해서는 [ or 또는 || ]를 입력하면 된다.
echo "a xor b는 ".($a ^ $b)."<br/>";
xor 논리 연산자는 피연산자의 값이 서로 다를 때 True를 반환한다.
a와 b는 서로 다른 값을 갖고 있으니 xor 논리 연산의 값은 True이다.
xor 논리 연산을 실행하기 위해서는 [ ^ 또는 xor ]를 입력하면 된다.
echo "!a 는 ".(!$a)."<br/>";
not 논리 연산자는 피연산자의 값을 반전시키는 기능을 수행한다.
a의 경우에는 true에서 false로, b의 경우에는 false에서 true로 바뀌게 되는 것이다.
not 논리 연산을 실행하기 위해서는 " ! "를 입력하면 된다.
Step 6 :: 비트 연산자
비트 연산자는 이진수에 대해 비트 단위로 연산을 수행하는 연산자이다.
위에서 살펴본 논리 연산자와 비슷하게 and, or, xor, not 연산이 가능하고 부가적으로 shift 연산도 존재한다.
<?php
$a = 0b0110;
$b = 0b1010;
echo "a & b는 ".($a & $b)."<br/>";
echo "a | b는 ".($a | $b)."<br/>";
and 비트 연산자는 비트 값이 둘 다 1인 경우에만 1을 반환한다.
논리 연산자에서의 True를 비트 연산자에서 이진수 1이라고 생각하면 된다.
a와 b는 세 번째 비트에서만 동일하게 1을 갖기 때문에 결과는 "0010"이 나온다.
or 비트 연산자는 비트 값이 둘 중 하나만 1이어도 1로 반환한다.
a의 두 번째, 세 번째 비트와 b의 첫 번째, 세 번째 비트가 1이기 때문에 결과는 "1110"이 될 것이다.
echo "a ^ b는 ".($a ^ $b)."<br/>";
echo "~a 는 ".(~$a)."<br/>";
xor 비트 연산자는 비트 값이 서로 다를 때는 1을, 같은 때는 0을 반환한다.
a와 b는 첫 번째, 두 번째 비트는 서로 다르고 세 번째, 네 번째 비트는 서로 같기 때문에 결과는 "1100"이 된다.
not 비트 연산자는 비트 값을 반전시키는 기능을 수행한다.
a에 not 비트 연산을 실행하면 0110에서 1001로 각 자릿수의 비트가 0은 1, 1은 0으로 뒤바뀌게 된다.
echo "a << 2 는 ".($a << 2)."<br/>";
echo "b >> 2 는 ".($b >> 2)."<br/>";
shift 비트 연산자는 [ >> 또는 << ]로 나타낸다.
왼쪽으로 비트를 옮길 때는 "<<", 오른쪽으로 비트를 옮길 때는 ">>"
연산자를 기준으로 우측에 입력된 정수만큼 비트를 움직이게 된다.
첫 번째 줄은 변수 a의 비트를 왼쪽으로 2번 움직여!라는 의미로
이진수 : 0110 -> 1100 -> 11000
십진수 : 6(4+2) -> 12(8+4) -> 24(16+8)
4 자릿수를 유지하는 게 아니라 왼쪽으로 이동하는 만큼 우측에 비트 0이 붙으면서 2배씩 값이 커지게 된다.
두 번째 줄은 변수 b의 비트를 오른쪽으로 2번 움직여!라는 의미로
이진수 : 1010 -> 0101 -> 0010
십진수 : 10(8+2) -> 5(4+1) -> 2
제일 왼쪽 비트를 벗어나버리면 그 값은 버리고 남아있는 비트만 값으로 인정한다.
왼쪽 shift와 반대로 오른쪽 shift는 이동하는 만큼 2배씩 값이 감소되는 걸 볼 수 있다.
Step 7 :: 기타 연산자
지금까지 살펴본 연산자를 제외하고 그밖에 존재하는 연산자를 소개해볼까 한다.
1) 조건부 삼항 연산자
개인적으로 React native 코딩할 때 많이 사용했던 연산자로 알아두면 유용할 듯하다.
삼항 연산자는 말 그대로 세 개의 항을 갖는 구조이다.
condition ? True인 경우 실행 : False인 경우 실행
첫 번째 항은 "조건"이다. 물음표 앞에까지 기재한 내용을 조건으로 구분하고
두 번째 항으로 해당 조건이 만족되는 경우(True)에 실행할 내용은 ? 와 : 사이에 기재한다.
세 번째 항으로 조건이 만족되지 않는 경우(False)는 " : " 뒤에 내용을 작성한다.
<?php
$a = 23;
echo $a == 23 ? "a는 23이 맞다!" : "a는 23이 아니다!";
위의 코드를 해석해 보자면 a는 23이라는 값을 갖고 있는 상태에서 조건부 삼항 연산자에 참조된다.
이때 삼항 연산자의 수행 내용은 다음과 같다.
"변수 a가 23이라는 값을 갖고 있어?!" (? 까지의 내용)
"그렇다면 a는 23이 맞다고 말해." (True인 경우)
"그렇지 않다면 a는 23이 아니라고 말해" (False인 경우)
2) NULL 병합 연산자
NULL 병합 연산자는 " ?? "로 나타내면 삼항 연산자를 대체할 수 있는 연산자이다.
두 개의 피연산자의 값을 비교하는 데 이때 NULL 병합 연산자 왼측의 값이 NULL인지를 기준으로
어떤 값을 반환할 지 결정된다.
<?php
$a = "hello"; #$a = NULL;
$b = "bye";
$res = $a ?? $b;
echo $res;
5번째 줄에서 NULL 병합 연산자를 사용해서 어떤 값을 할당하고 있는 거 같은 데.. 그 값이 무엇인지 살펴보자.
현재 변수 a와 b는 NULL이 아닌 문자열을 각각 저장하고 있다.
NULL 병합 연산자 기준으로
왼쪽 변수 값이 NULL이 아니면 왼쪽 변수 값이 선택된다.
반대로 왼쪽 변수 값이 NULL이면 오른쪽 변수 값이 선택된다.
위의 예시는 NULL 병합 연산자의 왼쪽 변수인 a가 null이 아니기 때문에 hello가 출력될 것이고
만약 a가 null이 된다면 오른쪽 변수 값인 bye가 출력된다.
3) 배열 연산자
배열 연산자는 두 배열을 비교하는 데 사용할 수 있는 연산자이다.
+ 기호를 사용하면 두 배열의 합집합을 반환한다.
<?php
$arr1 = array("키위", "멜론");
$arr2 = array("딸기", "수박", "멜론");
print_r($arr1+$arr2);
주의할 점은 여기서 말하는 합집합을 두 배열의 요소의 합으로 생각하면 안 된다는 것이다.
결과를 보면 알 수 있듯이 배열 1에 배열 2를 합하면
배열 1의 요소에 배열 2의 세 번째 요소만 더해진 걸 볼 수 있다.
배열을 합할 때는 왼쪽 배열의 인덱스 또는 키 값을 유지하면서 오른쪽 배열을 덧붙이기 때문에
arr2의 첫 번째, 두 번째 요소는 arr1의 인덱스를 유지하기 위해 무시되고 세 번째 요소만 더해진 것이다.
(동일한 인덱스 또는 키 값에 대해서는 왼쪽 배열의 값을 사용한다.)
반대로 arr2에 arr1을 합하는 연산을 실행하게 되면 arr2는 요소가 3개인 반면 arr1은 요소가 2개이기 때문에
arr2의 키 값을 유지하기 위해 arr1의 값은 무시될 것이다.
결과를 확인해보면 arr2 값이 그대로 출력될 걸 확인할 수 있다!
그 외에도 [ ==, ===, !=, <>, !== ] 배열 연산자도 존재하지만 내용은 앞에서 살펴본 비교 연산자와 비슷하기
때문에 생략한다.
다만 배열 연산자이기 때문에 " === " & " !== " 연산자는
" == " & " != " 연산자가 비교하는 키/값 쌍에 더불어 배열 요소의 순서까지 동일해야 True를 반환한다는 걸
알고 넘어가자!
'PHP' 카테고리의 다른 글
php 반복문 다루기 (0) | 2023.07.04 |
---|---|
php 조건문 다루기 (0) | 2023.07.03 |
php 연산자 다루기 (1) (1) | 2023.07.01 |
php 데이터 타입 (0) | 2023.06.30 |
php 상수 다루기 (0) | 2023.06.30 |