MySQL은 SQL 주입을 어떻게 방지합니까? SQL 인젝션 원리 및 예방

MySQL의SQL 주입을 방지하는 방법? SQL 인젝션 원리 및 예방

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}'");

위의 인젝션 문에서는 $name 변수를 필터링하지 않고, 필요하지 않은 SQL 문을 $name에 삽입하면 users 테이블의 모든 데이터가 삭제됩니다.

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

SQL 인젝션을 방지하기 위해서는 다음 사항에 주의해야 합니다.

  • 1. 사용자 입력을 절대 신뢰하지 마십시오.사용자 입력을 확인하고 정규식을 사용하거나 길이를 제한하거나 작은따옴표 및 큰따옴표를 "-"로 변환하는 등의 작업을 수행할 수 있습니다.
  • 2. 동적 어셈블리 SQL을 사용하지 마십시오. 매개변수화된 SQL을 사용하거나 데이터 쿼리 및 액세스에 저장 프로시저를 직접 사용할 수 있습니다.
  • 3. 관리자 권한으로 데이터베이스 연결을 사용하지 말고 각 응용 프로그램에 대해 제한된 권한으로 별도의 데이터베이스 연결을 사용하십시오.
  • 4. 기밀 정보를 직접 저장하지 말고, 비밀번호 및 민감한 정보를 암호화하거나 해시아웃(hash out)하지 마십시오.
  • 5. 응용 프로그램의 예외 정보는 가능한 한 적은 수의 힌트를 제공해야 하며 사용자 지정 오류 정보를 사용하여 원래 오류 정보를 래핑하는 것이 가장 좋습니다.
  • 6. SQL 주입의 감지 방법은 일반적으로 보조를 채택합니다.软件또는 웹 사이트 플랫폼을 감지하는 소프트웨어는 일반적으로 SQL 주입 감지 도구 jsky를 사용하고 웹 사이트 플랫폼에는 Yisi 웹 사이트 보안 플랫폼 감지 도구가 있습니다. MDCSOFT SCAN et al.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 문에 삽입

like를 쿼리할 때 사용자가 "_" 및 "%"로 값을 입력하면 다음과 같은 상황이 발생합니다. 사용자는 원래 "abcd_"를 쿼리하려고 했지만 쿼리 결과에 "abcd_", "abcde" 및 "abcdf가 포함됩니다. " 등; 사용자가 "30%"(참고: XNUMX%)를 쿼리하려는 경우에도 문제가 발생합니다.

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)
参数描述
필수의.확인할 문자열을 지정합니다.
문자선택 과목.addcslashes()의 영향을 받는 문자 또는 문자 범위를 지정합니다.

发表 评论

귀하의 이메일 주소는 공개되지 않습니다. 必填 项 已 用 * 标注

위쪽으로 스크롤