PHP 인젝션

2021. 12. 20. 15:44·Development/PHP

시작

로그인 기능을 사용 할 때 mysql_escape_string 함수를 사용하는 이유는 ?

ex. mysql_escape_string($_POST[u_id])

 

이는 인젝션을 방어하기 위한 가장 기본적인 부분이다.

 

* 인젝션 : 해킹 또는 공격을 위한 의도적인 코드 변조(웹해킹의 한 종류)

ex. SQL문 같은 경우 where절을 이용하여 조건을 준 후, 데이터를 받아오는데 그 과정에서 논리연산자(and, or, not 등)을 이용해서 코드를 변경하는 것

 

 

💬설명

# 1. 아이디/비밀번호가 맞는 계정정보를 받아오는 코드를 작성
SELECT * FROM users WHERE id = "$_POST['id']" AND pw = "$_POST['pw']"

# 2. 악의적인 사용자는 $_POST['pw'] 의 값으로
" OR "1" = "1 이라는 값을 전달

# 3. 쿼리문
SELECT * FROM users WHERE id = "admin" AND pw = "" OR "1" = "1"
이 되며, 의도하던 바와는 다른 쿼리문이 실행됨

# 4. 방지하기 위해 mysql_escape_string 이라는 함수를 사용함.
$_POST['pw'] 에 mysql_escape_string 을 씌워주면 \" OR \"1\" \= \"1 이 됨.
ex. ( "" OR "1" = "1" ) ==> ( \" OR \"1\" \= \"1 )

# 5. 함수 사용 후 쿼리문은
SELECT * FROM users WHERE id = "admin" AND pw = "  \" OR \"1\" \= \"1  " 이 됨.

# 6. 결론 : 악의적인 입력값이 따옴표를 벗어나 쿼리문으로 빠져나오지 않으므로, 보다 보안이 강화됨.

 


 

💬Example

mysql_escape_string(addslashes(htmlspecialchars($password)))

 

위 코드의 함수를 분해해서 보면 각각 3가지 함수가 사용됨.

1️⃣ mysql_escape_string
2️⃣ addslashes
3️⃣ htmlspecialchars

* \ : 백슬래시

 

- mysql_escape_string : \를 통해서
- addslashes : 따옴표 등에 \를 추가 (ex. I'm => I\'m)
- htmlspecialchars : < >

 

htmlspecialchars

: HTML 코드를 사전 정의된 문자로 바꾸어줌.

ex. echo htmlspecialchars('<b>굵게</b>'); => &lt;b&gt;굵게&lt;/b&gt;

각각 < 가 &lt; > 가 &gt; 으로 변환됨.

 

이렇게 변환하게 되면 꺽쇠 괄호를 통해 부등호 연산시키려는 시도를 방지할 수 있음.

 

 

 

정리

원래 나타내야할 실행결과가 있는데, 임의로 코드가 실행되게 작성하면(인젝션) 개발자의 의도와 다르게 페이지 내용이 나타날 수 있음.

이를 방지하기 위해 <를 %lt;라는 형식등으로 바꿔줌.(위의 3가지 함수 모두 이와 같은 기능을 함)

즉, 코드 실행에 쓰이는 문자를 정해진 문자로 치환해준다.

 

 


 

코린이는 오늘도 배워갑니다 총총,,

 

'Development > PHP' 카테고리의 다른 글

[정규표현식] 정규식 문자열 제거(영문/숫자)  (0) 2021.12.28
정규식 html 태그제거  (0) 2021.12.28
정규식 공백제거(str_replace, preg_replace)  (0) 2021.12.28
인코딩 깨질 때  (0) 2021.12.23
[Crawler] post 방식의 json 파싱  (0) 2021.12.23
'Development/PHP' 카테고리의 다른 글
  • 정규식 html 태그제거
  • 정규식 공백제거(str_replace, preg_replace)
  • 인코딩 깨질 때
  • [Crawler] post 방식의 json 파싱
곽진돔
곽진돔
Developer
  • 곽진돔
    echo "곽박한 세상";
    곽진돔
  • 전체
    오늘
    어제
    • 분류 전체보기 (185)
      • Development (170)
        • Linux (13)
        • k8s (3)
        • Docker (5)
        • AWS (1)
        • PHP (35)
        • Python (21)
        • Java (1)
        • SpringBoot (4)
        • JavaScript (1)
        • React (9)
        • MySql (19)
        • MongoDB (1)
      • Daily (4)
      • Study (6)
        • TIL (1)
        • license (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 설정
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    크롤링
    springboot
    Linux
    SQL
    리액트
    MySQL
    리눅스
    react
    docker
    정규표현식
    Shell
    error
    nodejs
    윈도우
    db
    date
    Selenium
    HTML
    UTF8
    IP
    chromedriver
    CentOS
    인코딩
    스프링부트
    CentOS7
    Python
    ssh
    JavaScript
    Java
    php
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
곽진돔
PHP 인젝션
상단으로

티스토리툴바