[SQL Injection] php sql 인젝션 예방 > 기술자료

본문 바로가기

사이트 내 전체검색

[SQL Injection] php sql 인젝션 예방 > 기술자료

MySQL [SQL Injection] php sql 인젝션 예방

페이지 정보


본문

  1. magic_quote_gpc

    Sets the magic_quotes state for GPC (Get/Post/Cookie) operations. When magic_quotes are on, all ' (single-quote), " (double quote), \ (backslash) and NUL's are escaped with a backslash automatically.

    이것은 자동으로 addslashes() 를 하는 옵션입니다.
    하지만 sql 문법에 완전히 맞지 않습니다.
    물론 \ 로 escape 하는 문법을 지원해 주긴 합니다만, 원래의 문법은 아닙니다.
    게다가 ; 는 escape 시키지 않으니 사소한 실수로 큰 보안구멍이 발생할 수 있습니다.

  2. *_escape_string()

    각 sql 별로 escape_string() 이라는 함수가 제공됩니다.
    mysql_escape_string('문자열') 로 mysql 에 맞는 escape 된 문자열로 변환해 줍니다.
    일반적으로 sql 의 문법은 문자열을 작은따옴표(') 로 묶고, 작은따옴표를 표현하는것은 작은따옴표 2번 입니다.('')
    이것 '참' 좋군 이라는 문자열을 escape 시킨다면
    이것 ''참'' 좋군 이 되고
    query('INSERT INTO table VALUES (\'이것 \'\'참\'\' 좋군\');') 이 될 것입니다.

    보통은 post 받은 문자열을 db 에 넣을 것이므로
    $_POST = array_map('mysql_escape_string', $_POST); 로 한번에 escape 시키고 사용하면 됩니다.
    주의할 것은 select 한 결과를 그대로 재사용할 때 다시 escape 시켜야 한다는 것입니다.
    result 는 escape 되지 않은 문자열 입니다.

  3. prepared query

    좀더 안전하고 편리한 방법으로 prepared query 를 이용하는 방법이 있습니다.
    INSERT INTO table (a, b) VALUES (:a, :b) 라는 쿼리를 미리 prepare (컴파일?) 시킵니다.
    이 단계에서는 인젝션이 일어날 문자열이 아예 포함되지 않은채 prepare 됩니다.
    그 다음 prepare 된 쿼리에 문자열을 bind 하여 쿼리를 실행합니다.
    bind 단계에서는 파싱하지 않으므로 escape 시키지 않아도 안전합니다.

    mysqli, pg 등이 제공하고, PDO 를 이용하면 손쉽게 적용할 수 있습니다.
    $db = new PDO(접속);
    $stmt = $db->prepare('INSERT INTO table (a, b) VALUES (:a, :b)');
    $fields[':a'] = '\'; DELETE FROM table;\';
    $fields[':b'] = '\'; DELETE FROM table;\';
    $stmt->execute($fields);

    bind 값인 :a, :b 는 문자열이든 수이든 따옴표를 쓰지 않습니다.
    위의 예제 외에 bindParam() 함수를 이용하여 & 참조변수로 만들어 변수에 값만 채우고 execute() 하면 되는 방식도 있습니다.

    WHERE 절에는 prepare binding 을 사용하지 않는것이 좋습니다.
    sql 은 쿼리를 분석하여 최적의 인덱싱 방법을 결정합니다.
    쿼리에 검색조건이 완전하지 않으면 일반적인 인덱싱밖에 적용될 수 없습니다.

  4. 어떻게 뚫을 수 있지? 아무리 생각해도 이 코드에서는 뚫을 수 없어. 그러니 귀찮게 escape 안시켜도 돼.

    오만입니다. 개인의 생각에는 한계가 있고, 뚫린 후에는 늦습니다.
    escape 는 프로그래머의 기본 예절 입니다.


자료출처
http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=54406


 

댓글목록

등록된 댓글이 없습니다.


Total 2,645건 1 페이지
  • RSS
기술자료 목록
2645
Search   373  2025-10-15 17:04 ~ 2025-10-23 00:29  
2644
MySQL   623  2025-08-28 17:54 ~ 2025-08-28 17:55  
2643
PHP   1945  2025-02-07 09:27 ~ 2025-02-07 16:59  
2642
그누보드   1545  2025-02-07 08:55 ~ 2025-02-07 17:04  
2641
그누보드   1857  2024-11-26 21:14 ~ 2024-11-26 21:22  
2640
그누보드   3001  2024-11-22 10:52 ~ 2024-11-22 11:03  
2639
호스팅   2151  2024-11-19 14:41 ~ 2024-11-19 21:17  
2638
Linux   1598  2024-11-18 15:45 ~ 2024-11-18 15:48  
2637
일반   1483  2024-11-15 16:45 ~ 2024-11-15 16:46  
2636
Secure   1611  2024-11-06 18:48 ~ 2024-11-06 18:50  
2635
영카트   1919  2024-10-21 13:44 ~ 2025-08-29 23:40  
2634
전자결제   3223  2024-09-05 09:30  
2633
MySQL   2451  2024-03-29 14:14 ~ 2024-03-29 14:14  
2632
그누보드   2713  2024-02-23 18:40 ~ 2024-02-24 06:13  
2631
JavaScript   2737  2024-02-16 18:50 ~ 2024-02-16 20:37  
2630
Java   2826  2024-02-06 16:49  
2629
PHP   3062  2024-02-06 16:42  
2628
호스팅   2365  2024-01-29 12:54  
2627
PHP   2379  2024-01-26 11:04 ~ 2024-01-26 11:13  
2626
MySQL   2501  2024-01-08 17:37 ~ 2024-03-14 16:00  

검색

해피정닷컴 정보

회사소개 회사연혁 협력사 오시는길 서비스 이용약관 개인정보 처리방침

회사명: 해피정닷컴   대표: 정창용   전화: 070-7600-3500   팩스: 042-670-8272
주소: (34368) 대전시 대덕구 대화로 160 대전산업용재유통단지 1동 222호
개인정보보호책임자: 정창용   사업자번호: 119-05-36414
통신판매업신고: 제2024-대전대덕-0405호 [사업자등록확인]  
Copyright 2001~2025 해피정닷컴. All Rights Reserved.