SQL 주입은 웹 응용 프로그램의 일반적인 보안 취약점 중 하나입니다. 공격자는 악의적 인 SQL 코드를 쿼리에 삽입하여 무단 데이터베이스 액세스를받습니다. SQL 주입을 방지하기 위해 개발자는 SQL 쿼리의 보안을 보장하기 위해 일련의 조치를 취해야합니다. PHP에서 MySQLI_STMT :: __ Construct는 전처리 명세서 메커니즘으로서 개발자에게 SQL 주입 공격을 방지하는 강력한 도구를 제공합니다. 이 기사는 MySQLI_STMT :: __ Construct가 SQL 주입을 방지하는 데 중요한 역할을하는 방법을 심층적으로 탐구합니다.
MySQLI_STMT :: __ CORSUCT는 PHP의 MySQLI Extension이 새로운 전처리 명세서 개체를 생성하기 위해 제공하는 메소드입니다. 일반 SQL 쿼리 문과 달리, 전처리 명령문은 SQL 문 및 데이터를 별도로 처리 할 수 있도록하여 악성 코드 주입을 효과적으로 방지 할 수 있습니다. 전처리 문을 사용하여 개발자는 SQL 쿼리의 구조 및 매개 변수를 데이터베이스 서버로 별도로 전달하여 악의적 인 사용자가 SQL 문을 조작 할 수있는 기회를 피할 수 있습니다.
SQL 주입 공격은 일반적으로 사용자 입력 필드에 악성 SQL 코드를 삽입하여 구현됩니다. 예를 들어 로그인 양식이 사용자 이름과 비밀번호를 수신하고 다음 SQL 쿼리를 사용하여 사용자의 ID를 확인한다고 가정합니다.
<span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM users WHERE username = '<span class="hljs-subst">$username</span></span></span><span>' AND password = '</span><span><span class="hljs-subst">$password</span></span><span>'";
</span></span>
공격자가 사용자 이름 필드에서 다음 내용을 입력하는 경우 :
<span><span><span class="hljs-string">' OR '</span></span><span>1</span><span><span class="hljs-string">' = '</span></span><span>1
</span></span>
쿼리는 다음과 같습니다.
<span><span><span class="hljs-keyword">SELECT</span></span><span> </span><span><span class="hljs-operator">*</span></span><span> </span><span><span class="hljs-keyword">FROM</span></span><span> users </span><span><span class="hljs-keyword">WHERE</span></span><span> username </span><span><span class="hljs-operator">=</span></span><span> </span><span><span class="hljs-string">''</span></span><span> </span><span><span class="hljs-keyword">OR</span></span><span> </span><span><span class="hljs-string">'1'</span></span><span> </span><span><span class="hljs-operator">=</span></span><span> </span><span><span class="hljs-string">'1'</span></span><span> </span><span><span class="hljs-keyword">AND</span></span><span> password </span><span><span class="hljs-operator">=</span></span><span> </span><span><span class="hljs-string">'$password'</span></span><span>;
</span></span>
이는 인증을 우회하고 데이터베이스의 모든 데이터를 직접 반환하여 심각한 보안 문제가 발생합니다.
전처리 명세서는 데이터와 별도로 SQL 쿼리 구조를 처리하여 SQL 쿼리의 실행에 직접적인 영향을 미치지 않습니다. mysqli_stmt :: __ construct를 사용할 때, SQL 문의 구조는 데이터베이스로 전송되며, 이는 쿼리를 사전 정당화하고 컴파일하는 반면 실제 매개 변수는 이후 단계에서 쿼리에 바인딩됩니다. 이 방법은 동적 입력 데이터에서 쿼리 구조를 효과적으로 분리하여 SQL 주입 공격을 방지했습니다.
mysqli_stmt :: __ compuruct를 사용하면 쿼리 문의 모든 변수가 SQL 문자열에 직접 내장되는 대신 매개 변수로 전달됩니다. 예를 들어 다음 방법을 사용하여 전처리 명령문을 만듭니다.
<span><span><span class="hljs-variable">$conn</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$dbname</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$conn</span></span><span>-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT * FROM users WHERE username = ? AND password = ?"</span></span><span>);
</span></span>
이 시점에서 쿼리 문의 물음표 ( ? )는 자리 표시자를 나타내며 실제 값은 나중에 BINT_PARAM 메소드를 사용하여 바인딩됩니다.
<span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"ss"</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>);
</span></span>
이 경우 데이터베이스 시스템은 더 이상 $ username 과 $ password를 SQL 문의 일부로 취급하지 않지만 데이터로 처리됩니다. 즉, 사용자가 악성 SQL 코드를 입력하더라도 데이터베이스는 쿼리의 일부로이를 실행하지 않습니다.
Bind_Param을 호출 할 때 개발자는 각 매개 변수의 데이터 유형을 지정해야합니다. 예를 들어, "SS" 는 $ username 과 $ password가 둘 다 문자열 유형임을 의미합니다. 이 데이터 유형 제한 조건은 입력 데이터가 항상 올바른 형식으로 데이터베이스로 전달되도록하여 방지 효과를 더욱 향상시킵니다. 사용자가 특수 문자 또는 잠재적으로 악의적 인 코드를 입력하더라도 데이터베이스는 지정된 데이터 유형에 따라 처리되며 안전하지 않은 작업을 수행하지 않습니다.
SQL 주입 방지 외에도 MySQLI_STMT :: __ 구성 및 전처리 명세서도 다음과 같은 보안 이점을 제공합니다.
데이터 유출 방지 : 전처리 문을 사용하면 암호와 같은 민감한 데이터가 쿼리 로그에 직접 포함되지 않으므로 잠재적 인 누출 위험을 방지합니다.
성능 향상 : 전처리 진술을 재사용 할 수 있습니다. 동일한 구조의 쿼리에서 쿼리 만 한 번 컴파일하면됩니다. 후속 실행 중에 다른 매개 변수 만 바이어야하며, 특히 동일한 쿼리가 여러 번 실행될 때 실행 효율성을 향상시킬 수 있습니다.
오류 처리는 더욱 강력합니다 . 전처리 문을 사용하면 SQL 문의 형식이 항상 정확한지 확인하여 구문 오류로 인한 잠재적 위험이 줄어 듭니다.
mysqli_stmt :: __ 구성은 SQL 주입을 방지하는 데 중요한 역할을합니다. 쿼리의 구조 및 매개 변수를 별도로 처리하면 사용자 입력이 쿼리 문을 직접 수정할 수있는 기회를 피합니다. 또한 전처리 명세서는 데이터 유형 제약 조건을 통해 웹 애플리케이션의 보안을 더욱 향상시켜 성능을 향상시키고 보안을 향상시킵니다. 최신 PHP 개발에서 개발자는 사전 처리 문을 사용하여 응용 프로그램이 SQL 주입으로부터 보호되도록 데이터베이스 쿼리를 구축하는 것이 좋습니다.