SQL 인젝션이 성공하는 취약한 코드와 안전한 코드 > PHP
PHP

SQL 인젝션이 성공하는 취약한 코드와 안전한 코드

조회 128회 댓글 0건

아래는 쿼리 문장에 문자열을 넣어주는 일반적인 방식으로 SQL 공격에 무척 취약한 방식의 예 입니다.

보통 아래와 같은 문제가 발생하고 실무에선 쿼리를 보면 먼저 정보를 얻는것에서 시작을 합니다.



    # SQL 인젝션이 성공하는 경우 (취약한 코드)
    # 결과: SELECT * FROM users WHERE username = ''; DROP TABLE users; -- AND id = 123
    $test11 = "'; DROP TABLE users; --";
    $test22 = 123;
    $sql = "SELECT * FROM users WHERE username = '$test11' AND id = $test22";
    $result = $mysqliCon->query($sql);
 


값과 쿼리 명령을 별도로 분리해서 처리 하는 방식으로 SQL인젝션 공격에 해당하는것이 문자열에 들어가더라도 내부적으로 명령과 값을 분리해서 처리 하기 때문에 SQL 인젝션 공격이 먹히질 않습니다. 이 방식이 약간 더 복잡해 보이긴 하지만 외부에서 파라미터를 받는 방식이라면 이 방식을 사용해야 합니다.



    # 안전한 코드 (bind_param 사용)
    $sql = "SELECT * FROM users WHERE username = ? AND id = ?";
    $stmt = $mysqliCon->getCon()->prepare($sql);
    $stmt->bind_param("si", $test11, $test22);
    $stmt->execute();
   


위 프로그램은 제가 만들어진 코드 이기 때문에 사용에 약간 다를 수 있지만 핵심은 bind_param 를 사용한 것입니다.

예전에 printf("select * from test.test where id='%s', $id) 이런 방식은 sql 인젝션 공격을 허용하는 방식입니다. 문자열에 변수 넣어주는것이기 때문입니다.

그렇기에 근본적으로 해결하는 방법은 bind_param 또는 PDO에 있는 bindParam, bindValue 를 사용하는 것입니다.


138ac354e65f81604f66a1c91410e382_1742080737_1602.png
 

● SQL 인젝션(SQL Injection)

공격자가 웹 애플리케이션의 데이터베이스(SQL)를 조작할 수 있도록 악성 SQL 코드를 주입하는 공격 기법으로 공격이 성공하면 데이터 유출 조작 삭제 관리자 권한 탈취 심지어 서버 장악까지 가능 할 수 있는것으로 웹해킹에서 빈번한 방법중 하나임.


● SQL관련된 참고자료

  - MySQLi에서 Named Parameter처럼 사용할 수 있도록 변환하는 사용자 함수 > PHP

  - SQL 인젝션 테스트(체크) 프로그램 > 개발관련

  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 215건 1 페이지
  • profile_image 아래 프로그램 실행전에 앱키와 시크릿키는 API키 발급 받는곳에서 먼저 받아 놓아야 합니다.키움증권 REST API 사용신청 하는곳API 사용신청 | 키움 REST API REST는 특성성 프로그램 언어와 관계 없습니다. 예제에서 파이선 자바스크립트 이렇게 있고 PHP 없다고 하여 안되는것이 아닙니다.물론 인터넷(네트워크) 지원 안되는 언어는 안됩니다.그렇기 때문에 리눅스 쉘에서 쉽게 테스트 할 수 있는 아래도 당연히 됩니다.curl -X POST -H "Content-Type: application/json;charset=UTF-8" -d '{"grant_type":"client_credentials","appkey"…
  • profile_image 쉽게 한번만 사용할거냐 여러번 사용할거냐에 대한 차이라고 생각해도 됩니다.특별한 경우가 아니라면 다목적으로 사용이 가능한 bindParam 를 많이 사용 합니다. 구분해서 사용하려면 또 신경을 써야 하기 때문에 그렇죠▶ bindParam() (참조 바인딩)  - 변수 자체를 바인딩 (이후 변수 값이 바뀌면 SQL 실행 시 그 값이 적용됨)  - 변수를 직접 전달해야 하고 즉시 값 대입이 불가능  - 반복문에서 같은 변수를 여러 번 사용할 경우 적합. 그리고 파라미터는 상수가 아니라 변수를 넣어줘야 합니다.△ 비유: 패스트푸드점에서 "세트 메뉴 1번"을 주문하고, 음료는 나중에 결정할 수 있는 방식    $menu = "…
  • profile_image 문자열:s 숫자:i 이렇게 사용하는 방식은 파라미터가 많으면 복잡해서 알아보기 힘들죠그래서 만들어진 사용자 함수 입니다.    # MySQLi에서 Named Parameter처럼 사용할 수 있도록 변환하는 사용자 함수    function prepareNamedQuery($mysqliCon, string $sql, $params) {        preg_match_all('/:\w+/', $sql, $matches);        $namedParams = $matches[0];         $sql = str_replace($namedParams, '?', $sql);        $values = [];     …
  • profile_image 아래는 도메인 목록을 배열로 가지고 있다고 가정하고 만들어진 프로그램 입니다.kr의 경우 요즘은 utf8로 나오기 때문에 euckr 환경이신분은들은 캐릭터셋을 변경하는 기능이 한줄 더 들어가야 합니다.그리고 후이즈 조회는 너무 많이 하면 차단 됩니다.여기서 너무 많다는 기준은 없지만 최소 몇 백은 되기 때문에 도메인 만료일 체크하기 위해서 실행하는것에는 문제는 없습니다.    # 루트 도메인만 추출    $root_domains = [];    foreach ($domains as $domain) {        if ($domain === '_default_') continue; // 제외        if (preg…
  • profile_image 앞으로 캐릭터셋은 utf-8이 아니라 utf-8 bom을 사용해야 합니다. utf-8 캐릭터셋은 한글이 깨져서 보이는데 이때문에 예전에 ANSI로 저장(euc-kr) 처리를 많이 하곤 했습니다. 하지만 현재는 utf-8과 호환되는 utf-8 bom 사용하는 것이 좋겠지요.그래야 더 풍부한 캐릭터셋 특수문자(이모티콘)를 사용할 수 있기 때문에 그렇습니다. euc-kr은 이모티콘을 사용하지 못해요~ 엑셀(Excel)에서 CSV 파일 한글 깨지지 않게 하려면  - 엑셀에서 바로 CSV 열기: EUC-KR 또는 UTF-8 BOM 캐릭터셋 참고사항  - 글로벌 호환성 생각: UTF-8 BOM  - 서버 시스템 처리 위주: UTF…
  • profile_image csv파일 읽어서 처리할 때 날짜를 기준으로 하는데 같은 날짜가 아니라 다른 날짜로 처리 해야 되는 경우 만들어진 프로그램 입니다.csv파일의 캐릭터셋에 대해선 별도 정리가 필요한 상태이고 윈도우10 사용한지 오래 되었는데 이 문제가 업그레이드 되면서 변경 되었는지 어땟는지는 현재로선 중요하지 않고 잘 나오면 그만인거죠cmd도 예전엔 cp949로해서 처리 했는데 지금은 둘다 잘 보이는 구조로 되어 있는듯 합니다.그리고 엑셀은 euckr, utf-8 bom 두개가 문제 없으며 utf-8은 안됩니다.<?php// 공휴일 배열$holidays = [    "2025-01-01", // 신정    "2025-02-11",…

상업적 이용 금지. 컨텐츠는 개인 용도로만 사용이 가능 합니다.