> 데이터 베이스 > MySQL 튜토리얼 > 준비된 문에서 동적 테이블 및 필드 이름을 어떻게 안전하게 사용할 수 있습니까?

준비된 문에서 동적 테이블 및 필드 이름을 어떻게 안전하게 사용할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-12-08 17:10:12
원래의
554명이 탐색했습니다.

How Can I Safely Use Dynamic Table and Field Names in Prepared Statements?

준비된 문을 사용하여 식별자와 키워드 바인딩

문제:

동적 쿼리 만들기 준비된 문을 사용하지만 테이블 이름, 필드 이름 또는 구문 키워드 결과를 바인딩하려고 시도합니다. 빈 배열입니다.

코드:

function search_db($db, $searchTerm, $searchBy, $searchTable){
    try{
        $stmt = $db->prepare('
            SELECT 
                * 
            FROM 
                ?
            WHERE 
                ? LIKE ?
        ');
        $stmt->bindParam(1, $searchTable);
        $stmt->bindParam(2, $searchBy);
        $stmt->bindValue(3, '%'. $searchTerm.'%');
        $stmt->execute();
    } catch(Exception $e) {
        return array();
    }
    return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
로그인 후 복사

예상 결과:
데이터베이스의 결과 배열

실제 결과:
텅 비어 있음 array.

원인:
준비된 문은 데이터 리터럴만 바인딩할 수 있으며 식별자(예: 테이블 또는 필드 이름)나 구문 키워드는 바인딩할 수 없습니다.

해결 방법:

동적 식별자나 키워드를 사용하려면 다음을 따르세요. 단계:

  1. 형식 식별자:

    • 백틱으로 식별자를 묶습니다: "식별자".
    • 백틱 내에서 이스케이프 식별자를 두 배로 늘려서: "식별자".
  2. 허용 목록 동적 값:

    • 허용된 식별자 또는 키워드 목록을 만듭니다.
    • 사용하기 전에 화이트리스트와 동적 값을 확인하세요.

수정코드:

$field = "`" . str_replace("`", "``", $field) . "`";
$table = "`" . str_replace("`", "``", $table) . "`";
$sql = "SELECT * FROM $table WHERE $field = ?";
로그인 후 복사

키워드:

If 필요하다면 동적 키워드도 화이트리스트에 추가하고 유효성을 검사하세요. 다음 지침을 따르면 준비된 문에 동적 식별자와 키워드를 안전하게 포함할 수 있습니다.

위 내용은 준비된 문에서 동적 테이블 및 필드 이름을 어떻게 안전하게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿