MySQL과 SQL 인젝션

웹 페이지를 통해 사용자가 입력 한 데이터를 가져 와서 MySQL 데이터베이스에 인젝션하면 SQL 주입 보안 문제가 발생할 수 있습니다.

이 글에서는 SQL 인젝션을 방지하고 스크립트를 사용하여 SQL에 주입 된 문자를 필터링하는 방법을 소개합니다.

소위 SQL 인젝션은 SQL 명령을 웹 양식에 삽입하여 도메인 이름 또는 페이지 요청의 쿼리 문자열을 제출하거나 입력 한 다음 서버를 속여 악성 SQL 명령을 실행하는 것입니다.

사용자의 입력을 절대 신뢰해서는 안되며 사용자가 입력 한 데이터가 안전하지 않다고 가정해야하며, 사용자가 입력 한 데이터를 모두 필터링해야합니다.

다음 예에서 입력 한 사용자 이름은 문자, 숫자 및 밑줄의 조합이어야하며 사용자 이름 길이는 8 ~ 20 자입니다.

if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches))
{
   $result = mysqli_query($conn, ​"SELECT * FROM users 
                         ​WHERE username=$matches[0]");
}
​else 
{
  ​echo "username 비정상적인 입력";
}

특수 문자가 필터링되지 않은 SQL 상황을 살펴 보겠습니다.

// $name을 설정하여 불필요한 SQL문구를 삽입하기
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

위의 injection statement에서는 $ name 변수를 필터링하지 않았으며 필요하지 않은 SQL 문을 $ name에 삽입하면 users 테이블의 모든 데이터가 삭제됩니다.

PHP의 Mysqli_query ()는 여러 SQL 문을 실행할 수 없지만 SQLite와 PostgreSQL은 동시에 여러 SQL 문을 실행할 수 있으므로 이러한 사용자의 데이터를 엄격하게 확인해야합니다.

SQL 인젝션을 방지하려면 다음 사항에주의해야합니다.

  • 1. 사용자 입력을 절대 신뢰하지 마십시오. 사용자 입력을 확인하기 위해 정규 표현식을 사용하거나 길이를 제한 할 수 있습니다 (작은 따옴표와 큰 “-“등 변환).
  • 2. 동적 어셈블리 SQL을 사용하지 마십시오. 매개 변수화 된 SQL을 사용하거나 데이터 쿼리 및 액세스에 저장 프로 시저를 직접 사용할 수 있습니다.
  • 3. 관리자 권한으로 데이터베이스 연결을 사용하지 말고 각 응용 프로그램에 대해 제한된 권한으로 별도의 데이터베이스 연결을 사용하십시오.
  • 4. 기밀 정보를 직접 저장하거나 암호 및 민감한 정보를 암호화 또는 해시하지 마십시오.
  • 5. 응용 프로그램의 예외 정보는 가능한 한 적은 힌트를 주어야합니다. 사용자 정의 오류 메시지를 사용하여 원래 오류 메시지를 감싸는 것이 가장 좋습니다.
  • 6. SQL 주입 탐지 방법은 일반적으로 탐지를 위해 보조 소프트웨어 또는 웹 사이트 플랫폼을 채택하고, 소프트웨어는 일반적으로 SQL 주입 탐지 도구 jsky를 채택하며 웹 사이트 플랫폼에는 YSI 웹 사이트 보안 플랫폼 탐지 도구가 있습니다. MDCSOFT 스캔 등 MDCSOFT-IPS를 사용하면 SQL 주입 및 XSS 공격을 효과적으로 방어 할 수 있습니다.

SQL 인젝션 방어

Perl 및 PHP와 같은 스크립팅 언어에서 사용자가 입력 한 데이터를 이스케이프하여 SQL 인젝션을 방지 할 수 있습니다.

PHP의 MySQL 확장은 mysqli_real_escape_string () 함수를 제공하여 특수 입력 문자를 이스케이프합니다.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, ​"SELECT * FROM users WHERE name='{$name}'")

Like 문에 주입

쿼리 할 때 사용자가 입력 한 값에 “_”및 “%”가 있으면이 상황이 발생합니다. 사용자는 원래 “abcd_”를 쿼리하려고했지만 “abcd_”, “abcde”, “abcdf”가 있습니다. “30 %”를 쿼리 할 때도 문제가 발생합니다 (참고 : 30 %).

PHP 스크립트에서 addcslashes () 함수를 사용하여 다음 예제와 같이 위 상황을 처리 할 수 ​​있습니다.

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, ​"SELECT * FROM messages WHERE subject LIKE '{$sub}%'")

addcslashes () 함수는 지정된 문자 앞에 백 슬래시를 추가합니다.

구문 형식 :

addcslashes(string,characters)
모수설명
string필수입니다. 확인할 문자열을 지정합니다.
characters선택 사항. addcslashes ()의 영향을받는 문자 또는 문자 범위를 지정합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다