SQL Injection은 공격자가 악의적 인 SQL 코드를 SQL 쿼리에 삽입하여 데이터를 훼손하고 데이터베이스 서버를 제어하는 목적을 달성하기 위해 말입니다. 예를 들어, 개발자가 사용자가 직접 입력 한 경우 사용자가 SQL 쿼리 문으로 직접 분류하면 공격자가 특정 SQL 코드를 입력하여 쿼리 로직을 변경할 수 있습니다.
예를 들어 다음 쿼리 문이 있다고 가정합니다.
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
공격자가 다음을 사용자 이름 또는 비밀번호로 입력하는 경우 :
사용자 이름 : '또는'1 '='1
비밀번호 : '또는'1 '='1
이 쿼리 명령문은 다음과 같습니다.
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
이것은 일반 인증을 우회하고 공격자는 민감한 데이터를 쉽게 얻을 수 있습니다. 이를 방지하기 위해 매개 변수화 된 쿼리 (준비 문)를 사용하여 SQL 주입 공격으로부터 응용 프로그램을 보호 할 수 있습니다.
PDO는 SQL 주입, 즉 준비된 진술을 방지하기위한 강력한 메커니즘을 제공합니다. 전처리 명령문을 사용하면 쿼리의 사용자 입력은 SQL 코드의 일부가 아닌 매개 변수로 취급되므로 사용자가 악성 SQL 코드를 입력하더라도 데이터베이스가 실행되지 않습니다.
먼저 PDO를 사용하여 데이터베이스에 연결해야합니다. 연결을 만들 때 예외 처리가 활성화되어 있는지 확인하십시오. 이는 오류를 더 잘 디버깅 할 수 있습니다.
try {
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo "데이터베이스 연결에 실패했습니다: " . $e->getMessage();
}
PDO의 전처리 명령문은 SQL 주입을 방지 할뿐만 아니라 특히 동일한 유형의 여러 쿼리가 실행될 때 쿼리 성능을 향상시킵니다.
사용자의 사용자 이름을 기반으로 사용자 데이터를 검색 해야하는 쿼리가 있다고 가정합니다. 다음 코드를 사용할 수 있습니다.
$sql = "SELECT * FROM users WHERE username = :username";
$stmt = $pdo->prepare($sql);
// 바인딩 매개 변수
$stmt->bindParam(':username', $username, PDO::PARAM_STR);
// 쿼리를 실행하십시오
$stmt->execute();
// 쿼리 결과를 얻으십시오
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 출력 결과
foreach ($results as $row) {
echo "사용자 이름: " . $row['username'] . "<br>";
echo "우편: " . $row['email'] . "<br>";
}
위의 코드에서 : 사용자 이름은 자리 표시 자이며 사용자가 입력 한 사용자 이름은 Bindparam 메소드를 통해 자리 표시 자에게 바인딩됩니다. 이 방법을 사용하면 사용자가 입력하더라도 SQL 쿼리에 직접 스 플라이싱하는 대신 매개 변수로 데이터베이스로 전달되어 SQL 주입을 효과적으로 방지 할 수 있습니다.
pdostatement :: fetchall 메소드는 쿼리 결과를 배열로 반환 할 수 있습니다. 여러 행의 데이터를 얻는 데 이상적입니다. 위의 코드에서 fetchall (pdo :: fetch_assoc)은 각 요소가 데이터 행에 해당하는 연관 배열 형식으로 쿼리 결과를 반환합니다.
모든 쿼리 결과를 얻으려면 다음 방법을 사용할 수 있습니다.
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
한 줄 결과 만 필요하면 Fetch 메소드를 사용할 수 있으며 여러 줄 결과를 얻으려면 FetchAll이 좋은 선택입니다.
사용자 입력, 특히 URL 매개 변수를 처리 할 때는 전처리 문을 항상 사용해야합니다. 예를 들어 URL에 특정 ID 매개 변수가 포함 된 경우 SQL 문으로 직접 스 플라이 싱을 피해야하지만 전처리 문을 통해 전달해야합니다.
ID 매개 변수가 URL에 전달되었다고 가정하면 다음 코드를 사용하여 보안 쿼리를 수행 할 수 있습니다.
$id = $_GET['id']; // 얻다 URL 사내 id 매개 변수
$sql = "SELECT * FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
// 바인딩 매개 변수
$stmt->bindParam(':id', $id, PDO::PARAM_INT);
// 쿼리를 실행하십시오
$stmt->execute();
// 쿼리 결과를 얻으십시오
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
관련 태그:
SQL