> 기술 주변기기 > IT산업 > SQL 주입 공격으로부터 웹 사이트를 보호하는 방법

SQL 주입 공격으로부터 웹 사이트를 보호하는 방법

Lisa Kudrow
풀어 주다: 2025-02-18 09:09:09
원래의
885명이 탐색했습니다.

How to Protect Your Website Against SQL Injection Attacks SQL 주입 공격 : 키 포인트

SQL 주입 공격은 웹 사이트 입력 채널의 심각한 웹 사이트 보안 위협으로 데이터베이스를 공격하여 데이터를 훔치거나 변경하거나 관리 액세스를 얻을 수 있습니다. SQL 주입 공격을 방지하기 위해 사용자 입력을 신뢰하지 말고 항상 잠재적 공격 패턴이 있는지 확인하십시오. 여기에는 텍스트 입력뿐만 아니라 숨겨진 입력, 쿼리 문자열 매개 변수, 쿠키 및 파일 업로드도 포함됩니다. 사용자 입력은 서버 측에서 유형이 올바른지 확인하고 잠재적 인 악성 명령을 제거하기 위해 서버 측에서 확인해야합니다. 이는 SQL 명령을 변경할 수있는 입력에 이스케이프 문자를 추가하거나 SQL 명령의 사용자 입력을 명령 매개 변수로 대체하는 등 다양한 방식으로 달성 할 수 있습니다.

잠재적 취약점에 대한 웹 사이트 코드를 정기적으로 확인하는 것이 중요하며 SQL 주입 공격에 대비하는 것도 중요합니다. 잠재적 손상을 제한하기위한 조치에는 관리자 권리 사용을 피하고 민감한 데이터를 암호화하며 절대적으로 필요한 경우에 민감한 데이터를 저장하지 않는 것이 포함됩니다.

기타 보호 측정에는 다음이 포함됩니다. 데이터베이스 작업을 읽고 쓰기 위해 별도의 연결 사용, 특정 IP 주소로의 사용자 계정 액세스 제한, MS SQL Server의 Windows 인증 모델을 사용하고 SHA-2 Password Hash와 같은 강력한 알고리즘을 사용합니다.

이 기사를 검토 한 도움을 주신 Chris Lienert와 Guido Tonnaer에게 감사드립니다.

웹 사이트에 대한 모든 공격 중에서 SQL 주입은 가장 위험하고 일반적인 사건이며 지난해 비즈니스 및 조직에 실제 손상을 일으키는 데 사용되었습니다. 이 프로그램은 TalkTalk, Vtech, Wall Street Journal 및 미국 정부를 포함한 잘 알려진 조직 및 회사를 공격하는 데 사용되었습니다.

간단히 말해서, SQL 주입 (SQLI라고도 함)은 웹 사이트 입력 채널의 취약점을 이용하여 웹 애플리케이션 백엔드의 데이터베이스를 공격하여 가장 민감하고 귀중한 정보를 저장합니다. 공격자는이 체계를 사용하여 데이터를 훔치거나 변조하고 응용 프로그램 기능을 방해하며 최악의 경우 데이터베이스 서버에 대한 관리 액세스를 얻을 수 있습니다.

SQL 주입에 대해 알아야 할 사항과 웹 사이트를 공격으로부터 보호하는 방법이 있습니다.

SQL 주입 공격은 어떻게 작동합니까

SQL 주입 공격은 웹 요청을 통해 악의적 인 SQL 명령을 데이터베이스 서버로 전송하여 수행됩니다. 모든 입력 채널을 사용하여 양식 요소, 쿼리 문자열, 쿠키 및 파일을 포함한 악의적 인 명령을 보낼 수 있습니다. How to Protect Your Website Against SQL Injection Attacks 작동 방식을 이해하려면 사용자 이름과 비밀번호를 수락하는 로그인 양식이 있다고 가정 해보십시오.

사용자가 자신의 자격 증명을 입력하고 "로그인"버튼을 누르면 정보가 웹 서버에 다시 게시되고 SQL 명령과 결합됩니다. 예를 들어, PHP에서 코드는 다음과 같습니다.

그런 다음 명령이 데이터베이스 서버로 전송되고 생성 된 데이터 세트는 사용자 이름과 암호가 유효한 사용자 계정에 해당하는지 여부를 결정합니다. 평균 사용자 입력 "John"은 사용자 이름으로, "123456"은 암호로서 "123456"이 다음 명령으로 변환됩니다 : .

그러나 사용자가 다음과 같은 다른 것을 시도하기로 결정한 경우 :
$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
로그인 후 복사
로그인 후 복사
로그인 후 복사

<<>

생성 된 명령은 다음과 같습니다. 항상 비어 있지 않은 데이터 세트를 반환합니다.
SELECT * FROM users WHERE username='john' AND password='123456' 
로그인 후 복사
로그인 후 복사
이 코드 스 니펫을 사용하면 사용자가 올바른 자격 증명이 없으면 로그인 화면을 우회 할 수 있습니다.

이것은 가장 쉬운 형태의 SQL 주입 중 하나입니다. 조금 더 노력하면 동일한 사용자가 새 사용자 계정을 삽입하고 기존 사용자 계정을 삭제하거나 수정할 수 있습니다. 결과가 표시되는 페이지에서 동일한 체계를 사용하여 일반 방문자가 볼 수 있도록 원래 제한된 레코드 및 정보를 표시하거나 레코드 내용을 변경할 수 있습니다.

보다 심각한 경우, 공격자는 관리자 계정 (예 : MySQL의 "루트"또는 MS SQL Server의 "SA")을 통해 데이터베이스 서버에 연결된 경우 서버의 운영 체제를 완전히 파괴 할 수 있습니다. Windows 서버에서는 XP_CMDSHELL과 같은 확장 된 저장 프로 시저를 수행하는 공격자로 나타날 수 있습니다. 어떤 경우에는 공격자가 감염된 서버에서 사용자 계정을 생성하고 원격 데스크탑 기능을 활성화하고, SMB 공유 폴더를 설정하고, 맬웨어를 업로드하여 실제로 데이터베이스에 저장된 모든 것을 엉망으로 만들기 위해 SQL 주입 취약성을 이용하여 악용했습니다.

How to Protect Your Website Against SQL Injection Attacks <<> SQL 주입 공격으로부터 자신을 보호하는 방법

사용자 입력 채널은 SQL 주입 공격의 주요 매체이므로 대부분의 방어에는 공격 패턴에 대한 사용자 입력을 제어하고 검열하는 것이 포함됩니다.

다음은 사용자 입력이 안전 할 수있는 몇 가지 조치입니다.
SELECT * FROM users WHERE username='john' OR 1=1; -- ' AND password='123456' 
로그인 후 복사
사용자 입력을 신뢰하지 마십시오 사용자 입력에 관한 주요 규칙은 "불신과 검증"입니다. 즉, 모든 형태의 사용자 입력이 그렇지 않다는 것이 입증되지 않는 한 악의적 인 것으로 간주되어야 함을 의미합니다. 이는 텍스트 영역 및 텍스트 상자와 같은 간단한 입력 상자뿐만 아니라 입력 숨기기, 문자열 매개 변수, 쿠키 및 파일 업로드와 같은 다른 모든 것과 함께 작동합니다.


브라우저의 사용자 인터페이스를 사용하면 사용자가 입력을 작동 할 수 없다고해서 변조 할 수 없다는 의미는 아닙니다. Burp Suite와 같은 간단한 도구를 사용하면 사용자가 HTTP 요청을 캡처하고 서버에 제출하기 전에 숨겨진 양식 값을 포함한 모든 것을 수정할 수 있습니다. Base64를 통해 데이터를 인코딩 할만 큼 똑똑하다고 생각되면 악의적 인 사용자는 쉽게 디코딩, 수정 및 리코드 할 수 있습니다.

서버 측에서 입력 문자열을 확인하십시오 검증은 사용자가 올바른 유형의 입력을 제공하고 입력 문자열에 내장 될 수있는 잠재적으로 악의적 인 명령을 제거하는 프로세스입니다. 예를 들어, PHP에서는 mysql_real_escape_string ()을 사용하여 SQL 명령의 특성을 변경할 수있는 문자를 피할 수 있습니다.

위에서 언급 한 로그인 코드의 수정 된 버전은 다음과 같습니다.

이 간단한 수정은 악의적 인 사용자가 의도적으로 추가 한 단일 따옴표 앞에서 Escape 문자 ()를 추가하여 공격으로부터 코드를 보호합니다.

유효성 검사에 대한 작은 메모 : 클라이언트 확인 기능을 추가하면 훌륭한 작업을 수행합니다. 그러나 SQL 주입 공격에 대한 방어로 의존하지 마십시오. 클라이언트 기능을 사용하면 서버에 악의적 인 입력을 더 어렵게 만들 수 있지만, 일부 브라우저 조정 및 위에서 언급 한 것과 같은 도구로 쉽게 우회 할 수 있습니다. 따라서 서버 측 확인으로 보충해야합니다.

일부 프로그래밍 플랫폼 (예 : ASP.NET)에는 페이지 PostBack시 악성 콘텐츠에 대한 사용자 입력을 자동으로 평가하는 내장 기능이 포함되어 있습니다. 그러나 해커는 충분한 기술과 세심성으로 그들을 우회 할 수 있으므로 자신의 보안 검사기를 통해 여전히 사용자 입력을 실행해야합니다. 당신은 결코 조심하지 않을 것입니다.

명령 매개 변수를 사용하십시오 탈출보다 더 나은 대안은 명령 매개 변수를 사용하는 것입니다. 명령 매개 변수는 SQL 명령에 자리 표시 자 이름을 추가하여 정의되며 나중에 사용자 입력으로 대체됩니다. ASP.NET 은이 목적을 위해 매우 직관적이고 사용하기 쉬운 API 세트를 제공합니다.

다음은 C#로 작성된 코드입니다. 명령 매개 변수를 사용하여 웹 사이트를 SQL 주입 공격으로부터 보호하는 방법을 보여줍니다.
$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
로그인 후 복사
로그인 후 복사
로그인 후 복사
먼저 sqlcommand 객체를 생성하고 @parameter_name 패러다임을 명령 문자열에 사용하여 사용자 입력을 삽입해야합니다.

그런 다음 명령 문자열과 직접 연결하는 대신 SQLPARAMETER 객체의 인스턴스를 작성하여 사용자 입력을 삽입합니다.

마지막으로, sqlcommand 객체의 매개 변수 모음에 sqlparameter 객체를 추가하여 매개 변수를 제공된 입력으로 바꿀 것입니다. Ado.net은 나머지 작업을 담당합니다.

PHP의 <,>에 해당하는 것은 전처리 진술이며, 이는 ASP.NET 상대보다 더 복잡합니다. 여기서 탐색 할 수 있습니다.

입력의 설명 변환

이 트릭은 PHP와 같은 약한 언어에 대해 작동하므로 일반적으로 변수의 데이터 유형을 정의하지 않으며 언어는 서로 다른 데이터 유형의 변환을 자동으로 처리합니다.

설명 변환은 비 스트링 유형이 관련 될 때 입력을 피하기위한 바로 가기로 사용될 수 있습니다. 따라서 사용자가 AGE 매개 변수에 대한 INT를 입력하려면 PHP에서 다음 코드를 사용하여 입력이 안전한지 확인할 수 있습니다.

이 코드 스 니펫은 범위가 아닌 입력 유형을 확인합니다. 따라서 사용자가 마이너스 나이 (1300)와 같은 비현실적인 연령에 들어 가지 않도록 다른 코드를 실행해야합니다.

또한 또 다른 모범 사례는 비 스트링 입력과 관련된 SQL 명령에서 단일 따옴표를 사용하지 않는 것입니다. 따라서 다음 코드를 사용하지 마십시오 ...

$sql_command = "select * from users where username = '" . $_POST['username']; 
$sql_command .= "' AND password = '" . $_POST['password'] . "'"; 
로그인 후 복사
로그인 후 복사
로그인 후 복사

<<> SQL 주입 취약점을 근절하는 방법
SELECT * FROM users WHERE username='john' AND password='123456' 
로그인 후 복사
로그인 후 복사

일반적인 관행으로, 각 페이지의 코드를 확인하여 페이지 컨텐츠, 명령, 문자열 등을 사용자가 제공 할 수있는 소스와 결합하는 위치를 확인해야합니다. 취약점 및 보안 취약점에 대한 소스 코드를 확인하는 것은 소프트웨어 개발 프로세스의 고유 한 부분이어야합니다. SQLMAP와 같은 스캔 도구를 사용하여 웹 사이트 페이지를 크롤링하고 잠재적 인 SQL 주입 취약점을 찾을 수도 있습니다. 실제로 해커는 종종이 도구를 사용하여 대상 웹 사이트에서 SQL 주입 공격 벡터를 찾고 활용하므로 보안을 개선하는 데 사용하지 않겠습니까? 마지막 방어선

웹 사이트의 보안을 어떻게 강화하는지에 관계없이 SQL 주입이 발생하는 날을 준비해야합니다. 결국, 사이버 보안 산업에서 잘 알려진 바와 같이, 수비수는 모든 전투에서 승리해야하지만 해커는 한 번만 이길 필요가 있습니다.

SQL 주사의 피해자가 될 때 손상을 최소화하는 데 도움이되는 몇 가지 팁이 있습니다.

관리자 권한을 피하십시오 "루트"또는 "SA"계정을 사용하여 웹 응용 프로그램을 데이터베이스 서버에 연결하는 것은 가장 심각한 실수 중 하나입니다. 이미 언급했듯이 손상된 관리자 계정은 해커에게 전체 시스템에 액세스 할 수 있습니다. 아드먼이 아닌 계정조차도 손상을 일으킬 수 있으며, 특히 데이터베이스 서버가 다른 응용 프로그램과 데이터베이스간에 공유되는 경우 서버의 모든 데이터베이스에 액세스 할 수 있습니다.

따라서 웹 사이트의 백엔드에있는 특정 데이터베이스에 대한 간단한 읽기 및 쓰기 권한이있는 계정을 사용하는 것이 좋습니다. 따라서 웹 사이트가 SQL 주입을 통해 해킹되면 손상 범위는 그로 제한됩니다. 범위 내의 단일 데이터베이스.

보다 고급적인 접근 방식은 데이터베이스에서 읽거나 쓰는 코드 세그먼트에 별도의 연결을 사용하고 각 세그먼트의 권한과 역할을 더욱 줄이는 것입니다. 예를 들어, 데이터베이스에 대한 읽기 전용 연결을 사용하여 목록 페이지 (데이터베이스를 수정하지 않고 검색 매개 변수를 널리 사용하는)를 인코딩하여 코드의 결함 저항을 더욱 향상시킬 수 있습니다. MySQL에서는 원격 위치에서 손상된 계정에 대한 액세스를 방지하기 위해 사용자 계정에 대한 액세스를 특정 IP 주소 범위 ( "%"모델이 아닌 특정 IP 주소 범위로 제한함으로써 보안이 향상됩니다. MS SQL Server에서는 해커의 데이터베이스 액세스를 제한하고 다른 채널을 사용하여 데이터베이스를 입력 할 수없는 Windows 인증 모델을 사용하는 것이 좋습니다.

또한 SQL Server의 고급 기능을 사용하지 않는 한 Windows 서비스를 설정하여 고가의 "로컬 시스템"계정이 아닌 제한된 계정을 사용하는 것이 좋습니다. "SA"계정이 파손되면 손상이 최소화됩니다.

민감한 데이터를 암호화합니다 데이터베이스에서 민감한 데이터를 암호화합니다. 여기에는 비밀번호, 보안 질문 및 답변, 재무 데이터, 건강 정보 및 악의적 인 행위자에게 유용 할 수있는 기타 정보가 포함됩니다. 이렇게하면 해커가 데이터를 보유하고 있더라도 즉시 악용 할 수 없으므로 취약성, 플러그 취약점 및 강제 비밀번호 재설정과 같은 다른 반응을 보이면 도난당한 데이터가 보장됩니다. 공격 중입니다. 해독하기 전에 사람이 가치를 상실합니다. 암호를 해시하는 경우 SHA-2와 같은 강력한 알고리즘을 사용하여 곧 암호 보호의 업계 표준이됩니다. MD5 및 SHA-1은 구식이며 역전 될 수 있습니다.

다른 형태의 암호화의 경우 열쇠를 저장하고 단일 베팅을하지 않는 위치에주의를 기울이십시오. 키가 암호화 된 데이터 바로 옆에 있고 서버가 손상되면 해커가 쉽게 액세스하면 암호화를 사용하는 데 아무런 영향이 없습니다.

필요한 경우 민감한 데이터를 저장하지 마십시오 정보가 데이터베이스에 저장할 때마다 정보가 나쁜 사람의 손에 들어가면 얼마나 많은 손상이 발생할 수 있는지 고려하고 실제로 저장 해야하는지 결정하십시오. Ashley Madison Hacker는 약 3,700 만 명에 대한 어두운 비밀과 대부분의 개인 정보를 인터넷에 유출했으며, 공급자가 데이터베이스에서 민감한 정보를 삭제하지 못해서 일부 심각한 피해를 입었습니다.

따라서 결론은 실제로 필요하지 않으면 민감한 정보를 데이터베이스에 저장하지 마십시오. 그럼에도 불구하고 메시지가 더 이상 유용하지 않을 때 메시지를 삭제하십시오.

최종 생각

SQL 주입은 수십 년 동안 사용되어 왔으며 앞으로 몇 년 동안 취약점 순위를 계속 유지할 수 있습니다. 귀하와 사용자를 보호하기위한 몇 가지 간단하지만 신중하게 계산 된 몇 가지 단계 만 필요하며 보안 위반 소스 코드를 검토 할 때 최우선 순위 중 하나 여야합니다.

다음 큰 SQL 주입 데이터 위반의 피해자를 피하는 열쇠는 다음과 같습니다. 첫째, 사용자 입력을 제어하고 확인하십시오.

SQL 주입 공격으로부터 웹 사이트를 보호 할 때 FAQ SQL 주입 공격으로부터 내 웹 사이트를 보호하는 첫 번째 단계는 무엇입니까?

SQL 주입 공격으로부터 웹 사이트를 보호하는 첫 번째 단계는 SQL 주입이 무엇인지 이해하는 것입니다. SQL 주입은 공격자가 악성 SQL 문을 입력 필드에 실행을 위해 삽입하는 데 사용하는 코드 주입 기술입니다. 이로 인해 민감한 데이터, 데이터 손실 및 데이터 손상에 대한 무단 액세스가 발생할 수 있습니다. 이를 이해하면 입력 유효성 검사, 매개 변수화 된 쿼리 및 저장 절차를 사용하여 웹 사이트를 보호하는 것과 같은 측정 값을 구현할 수 있습니다.

입력 유효성 검사는 SQL 주입 공격을 방지하는 데 어떻게 도움이됩니까?

입력 검증은 사용자 입력의 구문, 내용 및 논리적 값을 정의하는 방법입니다. 이렇게하면 공격자가 악의적 인 SQL 코드를 웹 사이트의 입력 필드에 삽입하는 것을 방지 할 수 있습니다. 입력 검증 프로세스가 정의 된 기준을 충족하지 않는 입력을 거부하기 때문입니다.

매개 변수화 된 쿼리는 무엇입니까? SQL 주입 공격을 어떻게 방지합니까?

매개 변수화 된 쿼리는 자리 표시자가 값을 나타내는 데 사용되는 SQL 쿼리의 유형이며, 실행 시간에 값 자체가 제공됩니다. 이는 공격자가 악성 SQL 코드를 삽입하려고하더라도 SQL 명령의 일부가 아닌 문자열로 취급됩니다. 이것은 SQL 주입 공격을 효과적으로 방지합니다.

저장된 절차는 SQL 주입 공격을 방지하는 데 어떻게 도움이됩니까?

저장 프로 시저는 데이터베이스에 저장된 SQL 문이며 응용 프로그램에서 호출 할 수 있습니다. 데이터베이스에 직접 액세스 할 수 없으므로 SQL 주입 공격을 방지 할 수 있습니다. 대신 SQL 명령으로 실행되지 않은 매개 변수를 사용하므로 주입 된 SQL 코드가 실행되는 것을 방지합니다.

SQL 주입 공격을 방지하는 데 오류 처리가 어떤 역할을합니까?

올바른 오류 처리는 데이터베이스 구조 또는 SQL 구문에 대한 정보를 공개하지 않음으로써 SQL 주입 공격을 방지 할 수 있습니다. 오류가 발생하면 오류 메시지가 공격자에게 데이터베이스 구조 또는 SQL 구문에 대한 단서를 제공하여 공격을 향상시키는 데 사용할 수 있기 때문입니다.

최소 권한 원칙을 사용하여 웹 사이트를 SQL 주입 공격으로부터 보호합니까?

최소 권한 원칙은 의도 한 기능을 수행하는 데 필요한 권한을 사용자 계정 또는 프로세스 만 제공하는 것을 의미합니다. 예를 들어, 사용자 계정이 데이터베이스에서 데이터 만 읽어야하는 경우 쓰기 액세스를 부여 할 필요가 없습니다. 이를 통해 공격자가 취약성을 악용하려고 할 때 공격자가 할 수있는 일을 제한하여 SQL 주입 공격을 방지 할 수 있습니다.

SQL 주입 공격을 방지하는 데 정기적 인 업데이트가 어떤 역할을합니까?

정기적 인 업데이트는 일반적으로 알려진 취약점에 대한 패치가 포함되어 있기 때문에 SQL 주입 공격을 방지하기 위해 중요합니다. 소프트웨어를 최신 상태로 유지하면 SQL 주입 공격으로 악용 될 수있는 알려진 취약점으로부터 보호받을 수 있습니다.

웹 애플리케이션 방화벽을 사용하여 웹 사이트를 SQL 주입 공격으로부터 보호합니까?

WAF (Web Application Firewall)는 웹 애플리케이션과 인터넷 간의 HTTP 트래픽을 필터링하고 모니터링하여 SQL 주입 공격으로부터 웹 사이트를 보호하는 데 도움이 될 수 있습니다. HTTP 요청에서 악성 SQL 코드를 감지하여 SQL 주입 공격을 식별하고 차단할 수 있습니다.

침입 감지 시스템은 SQL 주입 공격을 방지하는 데 어떤 역할을합니까?

침입 탐지 시스템 (IDS)은 네트워크 트래픽을 모니터링하고 의심스러운 활동을 감지하여 SQL 주입 공격을 방지 할 수 있습니다. IDS가 잠재적 인 SQL 주입 공격을 감지하면 관리자에게 공격을 방지하기위한 조치를 취하도록 경고 할 수 있습니다.

SQL 주입 공격으로부터 웹 사이트를 보호하기 위해 암호화를 어떻게 사용합니까?

암호화는 공격자가 민감한 데이터를 읽기가 더 어려워서 SQL 주입 공격으로부터 웹 사이트를 보호하는 데 도움이 될 수 있습니다. 공격자가 SQL 주입 취약점을 악용하는 경우에도 여전히 데이터를 해독해야합니다.

위 내용은 SQL 주입 공격으로부터 웹 사이트를 보호하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿