PDO 문서에서는 문을 준비하면 수동 매개 변수 인용이 필요하지 않다고 제안하지만 대답은 "예"입니다. ." PDO는 기본적으로 MySQL용 준비된 명령문을 에뮬레이션하며 이 에뮬레이션은 때때로 악용 가능한 취약점을 생성할 수 있습니다.
연결 인코딩에 특정 취약한 문자 집합(예: gbk)이 포함될 때 잠재적인 취약점이 발생합니다. , cp932) 다음 조건이 충족됩니다.
이러한 경우 공격자는 잘못된 멀티바이트 문자가 포함된 페이로드를 만들고 클라이언트에서 예상되는 문자 집합과 연결의 실제 문자 집합 간의 불일치를 활용할 수 있습니다. 이를 통해 생성된 쿼리 문자열에 인용되지 않은 문자를 삽입하여 잠재적인 SQL 삽입을 초래할 수 있습니다.
예방:
완화:
다음 코드 조각은 안전한 사례를 보여줍니다.
// PDO without emulated prepares $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(array("xbf' OR 1=1 /*")); // PDO with DSN charset parameter $pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=gbk', $user, $password); $stmt = $pdo->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $stmt->execute(array("xbf' OR 1=1 /*")); // MySQLi (always uses true prepared statements) $mysqli->query('SET NAMES gbk'); $stmt = $mysqli->prepare('SELECT * FROM test WHERE name = ? LIMIT 1'); $param = "xbf' OR 1=1 /*"; $stmt->bind_param('s', $param); $stmt->execute();
PDO 준비된 문은 보안 사례와 함께 적절하게 사용될 경우 SQL 주입을 효과적으로 방지할 수 있습니다. 잠재적인 취약점을 완화하려면 취약한 인코딩을 방지하거나, 에뮬레이트된 준비를 비활성화하거나, NO_BACKSLASH_ESCAPES 모드를 활성화하는 것이 중요합니다.
위 내용은 PDO 준비문은 SQL 주입 공격으로부터 정말 안전한가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!