> 데이터 베이스 > MySQL 튜토리얼 > SQL 주입을 방지하기 위해 준비된 문에서 매개변수화된 테이블 이름을 어떻게 안전하게 사용할 수 있습니까?

SQL 주입을 방지하기 위해 준비된 문에서 매개변수화된 테이블 이름을 어떻게 안전하게 사용할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2025-01-23 18:08:10
원래의
326명이 탐색했습니다.

How Can We Securely Use Parameterized Table Names in Prepared Statements to Prevent SQL Injection?

준비된 문의 매개변수화된 테이블 이름: 딜레마

mysqli_stmt_bind_param이 SQL 삽입을 방지하는 데 효과적인 것으로 입증되었지만 변수가 영향을 미칠 때 제한이 발생합니다. 테이블 이름이 관련됩니다. 제공된 코드 조각에 설명된 대로:

function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{
    $statement = $mysqli->prepare("INSERT INTO " .$new_table . " VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}
로그인 후 복사

문제가 있는 $new_table 연결로 인해 SQL 삽입에 대한 취약성이 발생합니다. 다음 스니펫에 표시된 것처럼 이를 다른 자리 표시자로 바꾸려는 시도는 실패합니다.

function insertRow( $db, $mysqli, $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol )
{    
    $statement = $mysqli->prepare("INSERT INTO (?) VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'ssssisss', $new_table, $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}
로그인 후 복사

The Limitations of 준비된 문

핵심 문제는 무능력에 있습니다. 테이블 이름과 같은 SQL 문의 구조를 정의하는 매개변수를 보호하기 위한 준비된 문의 설정입니다. 이는 준비된 명령문이 명령문의 의미를 변경하지 않는 값에 대한 매개변수만 허용하기 때문입니다. 테이블 이름은 SQL 문의 유효성을 결정하므로 실행 중에 이를 수정하면 잠재적으로 무효화될 수 있습니다.

데이터베이스로 전송하기 전에 매개변수를 대체하여 준비된 문을 에뮬레이트하는 PDO와 같은 데이터베이스 인터페이스에서도 자리 표시자 값은 여전히 ​​유효합니다. SQL 문 내에 포함된 문자열입니다. 결과적으로 SELECT FROM ? mytable을 매개변수로 사용하면 궁극적으로 SELECT FROM 'mytable'이 데이터베이스로 전송되어 유효하지 않게 렌더링됩니다.

위험 완화

가장 안전한 접근 방식이 남아 있습니다. 문자열 내에서 $mytable을 사용하지만 사용자 입력을 확인하는 테이블의 화이트리스트를 동반해야 합니다. 이는 악의적인 행위자가 임의의 테이블에서 SQL 문을 실행하는 것을 방지합니다. 따라서 다음 코드는 안전한 구현을 보여줍니다.

if (whitelisted_tables($mytable)) {
    $statement = $mysqli->prepare("INSERT INTO $mytable VALUES (?,?,?,?,?,?,?);");
    mysqli_stmt_bind_param( $statment, 'sssisss', $Partner, $Merchant, $ips, $score, $category, $overall, $protocol );
    $statement->execute();
}
로그인 후 복사

위 내용은 SQL 주입을 방지하기 위해 준비된 문에서 매개변수화된 테이블 이름을 어떻게 안전하게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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