웹 개발에서 SQL 주입은 일반적인 공격 방법입니다. 공격자는 악의적 인 코드를 SQL 쿼리 문에 삽입하여 데이터베이스를 조작 한 다음 데이터를 훔치고 수정하고 데이터를 삭제하며 시스템 권한을 얻습니다. SQL 주입을 방지하기 위해 PHP 개발자는 데이터베이스의 보안을 보호하기 위해 효과적인 조치를 취해야합니다. 이 기사는 SQL 주입의 위험을 피하기 위해 Real_Query 기능을 통해 안전한 쿼리를 수행하는 방법을 소개합니다.
SQL 주입은 개발자가 사용자 입력을 올바르게 처리하지 않을 때 발생하는 보안 취약점입니다. 공격자는 불법 작업을 달성하기 위해 특별히 생성 된 SQL 코드를 입력하여 데이터베이스 쿼리 명령문의 논리를 탬 퍼링합니다. 일반적인 공격 방법은 다음과 같습니다.
데이터베이스에서 민감한 데이터를 봅니다
데이터 삭제 또는 수정
우회 인증
항상 사용자 입력을 확인하고 정리하십시오 . 사용자가 입력 한 모든 데이터에는 악의적 인 컨텐츠가 포함될 수 있으며 개발자는이 데이터에 SQL 쿼리를 방해 할 수 없도록 입력을 필터링하거나 탈출해야합니다.
전처리 문 및 매개 변수 바인딩 사용 : 전처리 문은 SQL 문을 사용자 입력과 분리 할 수 있으며, 이는 SQL 문의 구조에 직접적인 영향을 미치는 악의적 인 입력을 피할 수 있습니다.
데이터베이스 사용자 권한 제한 : 데이터베이스 계정에는 데이터베이스 계정에 너무 많은 권한을 부여하지 않도록 필요한 작업을 수행 할 권한 만 있어야합니다.
SQL 쿼리 로그 사용 : SQL 쿼리 로그를 녹음하고 분석하여 개발자는 잠재적 인 악성 동작을 발견하고 차단할 수 있습니다.
Real_Query 는 SQL 쿼리를 실행하는 데 사용되는 PHP의 MySQLI Extension에서 제공하는 기능입니다. 원래 SQL 쿼리를 실행 해야하는 경우 Real_Query를 사용할 수 있지만 사용자 입력이 올바르게 처리되지 않으면 SQL 주입의 취약성이 될 수도 있습니다. 따라서 Real_Query를 사용할 때는 더 조심해야합니다.
<?php
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM users WHERE username = '".$_GET['username']."'";
if ($conn->real_query($sql)) {
$result = $conn->use_result();
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'];
}
}
?>
위의 코드에서 SQL 쿼리 문은 $ _get [ 'username'] 의 사용자 입력을 직접 사용합니다. 사용자 가 '또는 1 = 1- 와 같은 악성 SQL 코드를 입력하면 SQL 주입 공격이 발생합니다. 따라서 Real_Query가 실행되기 전에 사용자 입력을 처리해야합니다.
SQL 주입을 방지하는 가장 효과적인 방법 중 하나는 준비된 진술을 사용하는 것입니다. 전처리 문을 통해 SQL 문 및 데이터가 분리되며 데이터베이스 엔진은 데이터를 SQL 코드로 구문 분석하지 않고 정상 값으로 처리합니다. 이것은 PHP의 MySQLI 확장을 사용하여 쉽게 달성 할 수 있습니다.
<?php
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
if ($stmt->execute()) {
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'];
}
}
?>
이 예에서 준비 함수는 먼저 SQL 쿼리를 컴파일하고 BINT_PARAM 함수는 쿼리 ( ? )의 매개 변수에 사용자 입력을 바인딩합니다. 이러한 방식으로 사용자가 입력 한 데이터는 SQL 주입 공격을 피하며 일반 텍스트로 처리됩니다.
Real_Query를 사용해야하는 경우 입력에 악의적 인 코드가 포함되어 있지 않도록 사용자 입력을 수동으로 탈출해야합니다. mysqli는 real_escape_string 함수를 제공하여 특수 문자를 문자열로 탈출합니다.
<?php
$conn = new mysqli("localhost", "username", "password", "database");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$username = $conn->real_escape_string($_GET['username']);
$sql = "SELECT * FROM users WHERE username = '$username'";
if ($conn->real_query($sql)) {
$result = $conn->use_result();
while ($row = $result->fetch_assoc()) {
echo "Username: " . $row['username'];
}
}
?>
real_escape_string을 사용하면 악의적 인 SQL 코드가 실행되지 않도록 사용자 입력에서 특수 문자를 피할 수 있습니다. 이 접근법은 SQL 주입의 위험을 줄일 수 있지만 완전히 피할 수는 없으므로 먼저 전처리 문을 사용하는 것이 좋습니다.
Real_Query 및 Preprocessing 문을 사용하는 것 외에도 SQL 주입의 위험을 줄이는 데 도움이되는 몇 가지 추가 보안 조치가 있습니다.
PDO (PHP Data Objects) 사용 : PDO는 또한 전처리 문을 지원하며 MySQLI 보다 유연하며 다양한 데이터베이스에 적합합니다.
데이터베이스 권한 최소화 : 데이터베이스 사용자가 필요한 작업을 수행하고 데이터베이스에 대한 액세스를 제한하며 공격자의 잠재적 방해 기능을 줄이는 권한 만 있는지 확인하십시오.
시기 적절한 업데이트 및 패치 : 모든 보안 취약점이 수정되도록 PHP, MySQL 및 서버 환경을 정기적으로 확인 및 업데이트합니다.
WAF (Web Application Firewall) 활성화 : WAF는 SQL 주입과 같은 공격을 감지하고 차단할 수 있으며 보호 시스템에 대한 중요한 장벽입니다.
SQL 주입은 가장 일반적인 웹 공격 중 하나이며 PHP 개발자는 데이터베이스의 보안을 보장하기 위해 효과적인 조치를 취해야합니다. Real_Query 및 Preprocessing 문을 올바르게 사용함으로써 SQL 주입의 위험을 효과적으로 방지 할 수 있습니다. 또한 개발자는 입력 검증, 데이터베이스 권한 관리 및 보안 패치 업데이트와 같은 다른 보안 조치를 결합하여 시스템의 전반적인 보안을 향상시켜야합니다.
관련 태그:
SQL