MySQL 인젝션의 목적은 웹사이트 데이터베이스를 장악하고 정보를 훔치는 것입니다. MySQL과 같은 일반적인 오픈 소스 데이터베이스는 많은 웹사이트 개발자가 비밀번호, 개인 정보, 관리 정보와 같은 중요한 정보를 저장하는 데 사용되어 왔습니다.
MySQL은 가장 널리 사용되는 서버 측 스크립팅 언어인 PHP와 함께 사용되기 때문에 널리 사용됩니다. 게다가 PHP는 인터넷을 장악하고 있는 Linux-Apache 서버의 주요 언어입니다. 따라서 이는 해커가 Windows 스파이웨어처럼 PHP를 쉽게 악용할 수 있음을 의미합니다.
해커는 보안되지 않은 웹 양식(드롭다운 메뉴, 검색 상자, 문의 양식, 쿼리 양식 및 확인란을 통해)에 대량의 악성 코드를 입력합니다.
악성 코드는 MySQL 데이터베이스로 전송된 후 "주입"됩니다. 이 프로세스를 보려면 먼저 다음 기본 MySQL SELECT 쿼리 문을 고려하십시오.
SELECT * FROM xmen WHERE 사용자 이름 = 'wolverine'
이 쿼리는 "xmen" 테이블이 있는 데이터베이스에 사용자 이름이 "wolverine"인 특정 데이터 조각을 반환하도록 요청합니다. MySQL에서.
웹 양식에서 사용자는 wolverine을 입력하고 이 데이터는 MySQL 쿼리로 전달됩니다.
입력이 유효하지 않은 경우 사용자 이름을' OR ''=''
로 설정하는 등 해커가 데이터베이스를 제어할 수 있는 다른 방법이 있습니다.
입력을 수행하는 데 일반 PHP 및 MySQL 구문을 사용하는 것이 안전하다고 생각할 수도 있습니다. 누군가 악성 코드를 입력할 때마다 "잘못된 쿼리"라는 메시지가 표시되지만 그렇지 않습니다. 해커는 영리하며 보안 허점은 데이터베이스 정리 및 관리 권한 재설정과 관련되어 있기 때문에 수정하기가 쉽지 않습니다.
MySQL 주입 공격에 대한 두 가지 일반적인 오해는 다음과 같습니다.
1. 네트워크 관리자는 악성 주입이 바이러스 백신 소프트웨어나 스파이웨어 방지 소프트웨어로 치료될 수 있다고 믿습니다. 사실 이러한 유형의 감염은 MySQL 데이터베이스의 약점을 악용합니다. 스파이웨어 방지 프로그램이나 바이러스 백신 프로그램으로는 간단히 제거할 수 없습니다.
2. 다른 서버나 외부 소스로부터 감염된 파일을 복사하여 MySQL 인젝션이 발생한다. 이것은 사실이 아닙니다. 이러한 유형의 감염은 누군가가 웹 사이트의 보호되지 않은 양식에 악성 코드를 입력한 다음 데이터베이스에 액세스할 때 발생합니다. MySQL 주입은 바이러스 백신 프로그램을 사용하는 대신 악성 스크립트를 제거하여 정리할 수 있습니다.
사용자 입력 유효성 검사 프로세스는
깨끗한 데이터베이스를 백업하고 서버에 저장하지 않습니다. MySQL 테이블 세트를 내보내고 데스크탑에 저장합니다.
그런 다음 서버로 이동하여 먼저 양식 입력을 일시적으로 끄십시오. 이는 양식이 데이터를 처리할 수 없으며 웹사이트가 종료된다는 의미입니다.
그런 다음 정리 프로세스를 시작하십시오. 먼저 서버에서 남아 있는 지저분한 MySQL 주입을 모두 정리합니다. 모든 데이터베이스, FTP 및 웹사이트 비밀번호를 변경하세요.
최악의 경우, 정리가 늦어지면 서버에서 실행 중인 숨겨진 프로그램이 있는지 다시 확인할 수 있습니다. 이러한 숨겨진 프로그램은 해커가 설치한 트로이 목마입니다. 완전히 제거하고 모든 FTP 권한을 변경하십시오. 서버에서 모든 트로이 목마와 악성 코드를 검사하세요.
PHP 스크립트 프로그램을 수정하면 양식 데이터가 처리됩니다. MySQL 주입을 방지하는 좋은 방법은 사용자 데이터조차 신뢰하지 않는 것입니다. MySQL 주입을 방지하려면 사용자 입력 유효성 검사가 매우 중요합니다.
사용자 입력을 필터링하는 필터를 설계하려면 다음과 같은 몇 가지 팁을 따르십시오.
1. 양식에 대한 입력은 숫자입니다. 0.001보다 크거나 같은지 테스트하여 숫자인지 확인할 수 있습니다(0을 허용하지 않는다고 가정).
2. 이메일 주소인 경우 "@", AZ, az 또는 일부 숫자 등 허용되는 문자 조합으로 구성되어 있는지 확인하세요.
3. 타인의 성명 또는 이용자명인 경우 SQL 인젝션에 사용될 수 있는 악성 문자인 * 등의 불법 문자가 포함되어 있는지 여부로 확인할 수 있습니다.
숫자 입력 유효성 검사
다음 스크립트는 0.001부터 무한대까지 유효한 숫자가 입력되었는지 확인합니다. PHP 프로그램에서는 특정 범위 내의 숫자 사용을 허용할 수도 있다는 점을 언급할 가치가 있습니다. 이 유효성 검사 스크립트를 사용하여 양식에 숫자만 입력되었는지 확인하세요.
프로그램에 세 개의 숫자 변수가 있다고 가정하고 이를 검증해야 하며 이름을 num1, num2 및 num3으로 지정하겠습니다.
//숫자 입력 검증
if($_POST['num1'] >= 0.001 && $_POST['num2'] >= 0.001 && $_POST['num3'] >= 0.001){
}else{
}
?>
그리고 조건은 3개 이상의 숫자를 수용하도록 확장될 수 있습니다. 따라서 10개가 있는 경우 AND 문만 확장하면 됩니다.
이는 계약 수량, 라이센스 번호, 전화번호 등과 같은 숫자만 허용하는 양식을 검증하는 데 사용할 수 있습니다.
텍스트 및 이메일 주소 입력 유효성 검사
다음은 사용자 이름, 이름, 이메일 주소와 같은 양식 입력의 유효성을 검사하는 데 사용할 수 있습니다.
//텍스트 입력 유효성 검사
if (! preg_match('/^[-az.-@,'s]*$/i',$_POST['name'])){
}
elseif ($empty==0){
}else{
}
?>
이 유효성 검사 스크립트의 한 가지 장점은 빈 입력을 허용하지 않는다는 것입니다. 일부 악의적인 사용자는 빈 입력을 통해 데이터베이스를 조작하기도 합니다. 위 스크립트를 사용하여 하나의 리터럴 변수 "$name"만 유효성을 검사합니다. 즉, 세 개의 텍스트 변수가 있는 경우 각 변수에 대한 유효성 검사 스크립트를 설정하여 데이터베이스에 입력하기 전에 각 변수가 검토를 통과하는지 확인할 수 있습니다.