Prepared 문을 사용한 MySQL 및 Java의 동적 열 이름 검색: 더 안전한 접근 방식
많은 MySQL 및 Java 개발자는 준비된 문을 사용하여 동적으로 생성된 열 이름으로 데이터를 검색해 왔습니다. 그러나 열 이름을 준비된 문의 매개 변수로 직접 대체하는 것은 지원되지 않으며 상당한 보안 위험이 발생합니다. 일반적으로 데이터베이스 스키마 재설계가 최선의 솔루션입니다.
아래와 같이 준비된 명령문을 이런 방식으로 사용하려고 하면 오류가 발생합니다.
String columnNames = "d,e,f"; String query = "SELECT a,b,c,?" + " FROM " + name + " WHERE d=?"; // This results in "SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'", not the desired result.
쿼리는 ?
자리 표시자를 열 이름이 아닌 문자열 리터럴로 처리합니다.
SQL 삽입 취약점을 방지하기 위한 보다 강력한 방법은 데이터베이스 자체 내에 동적 열 이름을 저장하는 것입니다. 다음 열이 있는 "user_data"와 같은 테이블을 고려해 보세요.
id
(기본 키)user_name
column_names
(쉼표로 구분된 열 이름 문자열)그런 다음 이 테이블에서 검색된 column_names
을 연결하여 SQL 쿼리를 구성할 수 있습니다.
String query = "SELECT a,b,c," + columnNames + " FROM " + name + " WHERE d=?";
이 접근 방식을 사용하면 열 이름이 주입 공격에 취약한 매개변수로 처리되지 않습니다. 문자열 연결을 사용하는 동안 취약한 부분(열 이름)은 데이터베이스에서 검색되어 이미 삭제되었습니다. 쿼리 생성에 사용되는 사용자 제공 데이터는 SQL 문의 직접적인 부분이 아니더라도 항상 삭제해야 합니다. 이 수정된 접근 방식은 동적 열 이름을 처리하기 위한 더 안전하고 관리하기 쉬운 솔루션을 제공합니다.
위 내용은 MySQL 및 Java에서 준비된 명령문을 사용하여 동적 열 이름으로 데이터를 검색하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!