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()의 영향을 받는 문자 또는 문자 범위를 지정합니다. |
희망 첸 웨이량 블로그( https://www.chenweiliang.com/ ) 공유 "MySQL은 SQL 주입을 어떻게 방지합니까? sql injection 원칙과 예방"을 참고하시면 도움이 될 것입니다.
이 기사의 링크를 공유하는 것을 환영합니다:https://www.chenweiliang.com/cwl-500.html
더 많은 숨겨진 트릭을 알아보려면🔑 Telegram 채널에 가입하세요!
마음에 드셨다면 공유하고 좋아요를 눌러주세요! 여러분의 공유와 좋아요는 저희의 지속적인 원동력이 됩니다!