PHP SQL Injection 방지 코드, 지정된 형식의 문자만 입력 받는 함수입니다

ToC on/off

개요

웹개발을 하면서 항상 신경 쓰이는 것이 SQL Injection을 비롯한 각종 보안문제입니다. 특히나 외부에서(사용자로부터) 데이터를 입력 받아서 DB에 입력하는 기능이 핵심이기 때문에 어떤 문자열이 입력될지 알 수가 없다는 것이 신경쓰이는 부분입니다.

사용자가 실수로 혹은 악의적인 목적을 가진 사람이 의도적으로 DB해킹을 목적으로 비정상적인 데이터를 입력하는 경우가 많기 때문에 해킹코드를 100% 막지는 못하더라도 최대한 막을 수 있도록 준비해두는 것이 필요합니다.

화이트 리스트

보안과 관련해서 흔히 얘기되는 중요한 원칙이 블랙리스트 방식이 아닌 화이트리스트 방식으로 해야 한다는 것입니다.

예를 들어 접근하면 안 되는 IP를 막는 것이 아니라 안전한 IP만 허용하고 나머지는 모두 막는 방식 또는 문제가 될 만한 문자열을 차단하는 것이 아니라 안전한, 허용되는 문자열을 제외하고는 모두 삭제하는 방식을 말합니다.

그래서 DB에 입력되는 문자열을 최종적으로 한번 더 검사해서 허용된 형식의 문자열을 제외하고는 모두 삭제하는 코드가 필요합니다. 대표적으로 숫자, 알파벳, 알파벳과 숫자 등이 있는데 나이나 년도, 제품 가격 같은 경우는 숫자만 필요하므로 숫자를 제외한 다른 문자열은 모두 제거하는 방식을 말합니다.

제가 주로 사용하는 코드가 아래에 있는데 이번에는 PHP에서 사용하는 형식입니다. 하지만, 정규표현식을 사용했으므로 다른 언어에서 사용할 때에도 정규표현식의 형태만 수정하면 쉽게 응용 가능합니다.

PHP 함수

숫자와 알파벳만 허용

<?php
  function sanitize_paranoid_string($string)
  {
    $string = preg_replace("/[^a-zA-Z0-9]/", "", $string);      
    return $string;
  }
?>

숫자만 허용

<?php
  function sanitize_int($string)
  {
    $string = preg_replace("/[^0-9]/", "", $string);      
    return $string;
  }
?>

숫자와 하이픈(-)만 허용

쇼핑몰 같은 곳에서 반품 등의 이유로 제품 매출이 마이너스가 되는 경우가 있는데 그때를 위한 코드입니다.

<?php
  function sanitize_price($string)
  {
    $string = preg_replace("/[^0-9\-]/", "", $string);      
    return $string;
  }
?>

DB에 문제를 일으킬 수 있는 문자열을 삭제

<?php
  function sanitize_db_string($string)
  {
    $string = preg_replace("/'|;|--|,/", "", $string);      
    return $string;
  }
?>
Tags: php