이 기사에서는 SQL 매개변수 쿼리가 SQL 삽입을 방지할 수 있는 이유에 대해 주로 설명합니다. 관심 있는 친구는 아래에서 모든 사람에게 도움이 되기를 바랍니다.
SQL 매개변수 쿼리가 SQL 삽입을 방지할 수 있는 이유는 무엇인가요?
1. SQL 인젝션이란?
양식 제출이나 입력 도메인 이름 또는 페이지 요청의 쿼리 문자열에 SQL 명령을 삽입하여 서버를 속여 악성 SQL 명령을 실행하도록 하는 것입니다.
-- 正常的查询语句 select * from users where username = 'a'; -- 恶意的查询语句 select * from users where username = 'a' or 1==1;
2. 매개변수화된 쿼리란
매개변수화된 쿼리는 데이터베이스를 쿼리할 때 데이터를 채워야 하는 위치에 매개변수를 사용하는 것을 의미합니다.
set @id = 1; SELECT * from users WHERE id = @id ;
3. SQL 문 실행 처리
SQL 문은 처리 흐름에 따라 실시간 SQL과 전처리 SQL 두 가지가 있습니다.
Instant SQL
Instant SQL은 DB에서 받아 최종 실행 후 반환됩니다. 일반적인 프로세스는 다음과 같습니다.
a. 词法和语义解析 b. 优化sql语句,制定执行计划 c. 执行并返回结果
특징: 하나의 컴파일, 하나의 실행.
SQL 전처리
프로그램 내 특정 SQL이 반복적으로 호출되거나, 실행될 때마다 개별 값만 달라질 수 있습니다. 실시간 SQL 처리를 매번 살펴보면 효율성이 상대적으로 낮다.
이때, SQL의 값을 자리 표시자로 대체할 수 있습니다. 먼저 SQL 템플릿을 생성한 다음, 명령문을 반복적으로 실행할 때 어휘 및 의미 분석을 수행하지 않고 매개변수만 바꾸면 됩니다. . 템플릿화되거나 매개변수화된 SQL 문으로 간주될 수 있습니다.
기능: 한 번 컴파일하고 여러 번 실행하여 여러 구문 분석 및 기타 프로세스를 제거합니다. (다중 실행은 동일한 세션에서 동일한 명령문을 다시 실행하는 것을 의미하므로 다시 구문 분석 및 컴파일되지 않습니다.)
-- 语法 # 定义预处理语句 PREPARE stmt_name FROM preparable_stmt; # 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] ...]; # 删除(释放)定义 {DROP | DEALLOCATE} PREPARE stmt_name;
4. SQL 전처리는 어떻게 SQL 주입을 방지합니까?
실행할 SQL이 컴파일됩니다. DB는 실행 시 다시 컴파일하지 않고 대신 SQL 템플릿을 찾아 매개변수를 전달한 후 실행합니다. 따라서 또는 1==1과 유사한 명령은 매개변수로 전달되며 의미론적으로 구문 분석 및 실행되지 않습니다.
-- 预处理编译 SQL ,会占用资源 PREPARE stmt1 from 'SELECT COUNT(*) FROM users WHERE PASSWORD = ? AND user_name = ?'; set [@a](https://learnku.com/users/16347) = 'name1 OR 1 = 1'; set @b = 'pwd1'; EXECUTE stmt1 USING @b,[@a](https://learnku.com/users/16347); -- 使用 DEALLOCATE PREPARE 释放资源 DEALLOCATE PREPARE stmt1;
추천 학습: "MySQL 비디오 튜토리얼"
위 내용은 SQL 매개변수화된 쿼리가 SQL 삽입을 방지할 수 있는 이유를 분석하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!