>데이터 베이스 >MySQL 튜토리얼 >SQL 인젝션 예시 및 SQL 인젝션 방지 방법

SQL 인젝션 예시 및 SQL 인젝션 방지 방법

零下一度
零下一度원래의
2017-05-09 13:29:581662검색

개요

  SQL 주입은 일부 데이터베이스의 외부 인터페이스를 사용하여 실제 데이터베이스 작업 언어에 사용자 데이터를 삽입하는 것입니다. 데이터베이스와 운영 체제에 침입하려는 목적을 달성하기 위해. 보안, 我们永远不要信任用户的输入 분야에서는 사용자가 입력한 데이터가 안전하지 않다는 것을 판단해야 하며, 사용자가 입력한 데이터를 모두 필터링해야 합니다. 没有(运行时)编译,就没有注入。그러므로 위와 같은 유형의 공격을 근본적으로 예방하는 방법은 데이터가 코드로 변해 실행되는 것을 방지하고, 항상 코드와 데이터의 경계를 구분하는 것입니다. 구체적으로 SQL 인젝션의 경우 실행된 악성코드는 데이터베이스의 SQL 해석 엔진을 통해 컴파일되기 때문에 사용자가 입력한 데이터가 데이터베이스 시스템에서 컴파일되는 것을 방지하기만 하면 된다.
다른 데이터베이스와 달리 MySQL은 다양한 SQL 모드(SQL 서버 모드)에서 실행될 수 있으며 다양한 클라이언트에 다양한 모드를 적용할 수 있습니다. 이런 방식으로 각 응용 프로그램은 자체 필요에 따라 서버의 작동 모드를 사용자 정의할 수 있습니다. 스키마는 MySQL이 지원해야 하는 SQL 구문과 수행해야 하는 데이터 유효성 검사의 종류를 정의합니다. 이는 보고되는 오류와 보고되지 않는 오류 등 다양한 수준의 오류 로그를 구성하는 Apache와 다소 유사합니다.

SQL 주입

1. 주입 인스턴스

//php代码
$unsafe_variable = $_POST['user_input'];   
mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");

포스트의 코드가 다음과 같은 경우:

value'); DROP TABLE table;--

Query코드는

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

가 되며 이는 테이블을 직접 삭제하고 데이터가 삭제됩니다.

2. sql 인젝션 방지

방법 1
prepareStatement+Bind-Variable: SQL문과 쿼리 매개변수를 각각 데이터베이스 서버로 보내 파싱한다.
PHP에는 두 가지 구현 방법이 있습니다.

//使用PDO(PHP data object)
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');  
$stmt->execute(array('name' => $name));  
foreach ($stmt as $row) {  
    // do something with $row  
}

//使用mysql扩展-mysqli
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}

방법 2
쿼리 문을 탈출합니다(가장 일반적인 방법): 애플리케이션에서 제공하는 변환 함수를 사용합니다.
|Application|Function|

|--------|
|MySQL C 
API
|
mysql_real_escape_string
()|
|MySQL++|escape和quote修饰符|
|PHP|使用mysql_real_escape_string()(适用于PHP4.3.0以前),之后可以使用mysqli或pdo|
|
Perl
 DBI|placeholder或quote()|
|Ruby DBI|placeholder或quote()|

방법 3
확인을 위해 자신만의 정의 함수를 사용하세요. 핵심은 입력이 다음과 같다는 것입니다. 불법 데이터가 이스케이프되고 필터링됩니다.
입력 유효성 검사는 다음과 같이 나눌 수 있습니다. 1. 데이터를 유효하게 구성합니다. 2. 알려진 불법 입력을 거부합니다. 3. 알려진 합법적인 입력만 받아들입니다.

방법 4
저장 프로시저를 사용합니다.
저장 프로시저에 대해서는 다음을 참조하세요. (9) 저장 프로시저 및 mysql의 사용자 정의 함수

sql 서버 모드

1.sql 모드 구문

#查看当前sql模式
select @@sql_mode;
#查看当前sql模式
SELECT @@session.sql_mode;
#修改当前sql模式
SET [SESSION][GLOBAL] sql_mode='modes';
  • 세션 옵션은 이 연결에서만 적용된다는 의미이고, 전역 옵션은 이 연결에서는 적용되지 않고 다음 연결에서는 적용된다는 의미입니다.

  • MySQL이 시작될 때 "--sql-mode='modes'"를 사용하여 sql_mode를 설정할 수도 있습니다.

  • 구성 파일에서 설정할 수 있습니다.

    2.sql_mode 공통 값

    ONLY_FULL_GROUP_BY:
    GROUP BYaggregation 작업의 경우 SELECT의 열이 GROUP에 없으면 나타납니다. BY에서는 해당 열이 GROUP BY 절에 없기 때문에 이 SQL은 불법입니다.

NO_AUTO_VALUE_ON_ZERO:
이 값은 자동 증가 열 삽입에 영향을 줍니다. 기본 설정에서 0 또는 NULL을 삽입하면 다음 자동 증가 값이 생성되는 것을 나타냅니다. 이 옵션은 사용자가 0 값을 삽입하려고 하고 열이 자동 증가하는 경우 유용합니다.

STRICT_TRANS_TABLES:
이 모드에서는 트랜잭션 테이블에 값을 삽입할 수 없으면 현재 작업이 중단되고 비트랜잭션 테이블에는 제한이 없습니다. .

NO_ZERO_IN_DATE:
엄격 모드에서는 0일과 월이 허용되지 않습니다.

NO_ZERO_DATE:
이 값을 설정하면 mysql 데이터베이스는 0 날짜 삽입을 허용하지 않으며 0 날짜를 삽입하면 경고 대신 오류가 발생합니다.

ERROR_FOR_pISION_BY_ZERO:
INSERT 또는 UPDATE 중에 데이터를 0으로 나누면 경고 대신 오류가 생성됩니다. 모드가 지정되지 않은 경우 MySQL은 데이터를 0으로 나눌 때 NULL을 반환합니다.

NO_AUTO_CREATE_USER:
GRANT가 빈 비밀번호로 사용자를 생성하는 것을 금지합니다.

NO_ENGINE_SUBSTITUTION:
필요한 스토리지 엔진이 비활성화되었거나 컴파일되지 않은 경우 오류가 발생합니다. 이 값이 설정되지 않으면 기본 스토리지 엔진이 대신 사용되며 예외가 발생합니다.

PIPES_AS_CONCAT:
은 또는 연산자 대신 문자열 의 연결 연산자 로 처리합니다. Oracle 데이터베이스와 동일하며 문자열 연결 기능인 Concat과 유사합니다.

ANSI_QUOTES:
ANSI_QUOTES를 활성화하면 식별자로 해석되므로 큰따옴표로 문자열을 인용할 수 없습니다.

설명

ORACLE의 sql_mode 설정은 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER와 동일합니다.

[관련 추천]

1. 무료 mysql 온라인 동영상 튜토리얼

MySQL 최신 매뉴얼

3. 불린 교육 Yan Shiba mysql 소개 영상 튜토리얼

위 내용은 SQL 인젝션 예시 및 SQL 인젝션 방지 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.