PHP 개발에서 SQL 주입 공격 방지는 중요한 보안 관행입니다. 준비된 진술과 바인딩 파라미터를 사용하는 것은 현재 가장 권장되는 방법 중 하나입니다. 그중에서도 MySQLI_STMT :: ATTR_GET 함수는 사용중인 바인딩 매개 변수만큼 직접적이지는 않지만, 역할과 원칙을 이해하는 과정에서 개발자의 보안 인식과 기술을 향상시키는 데 긍정적 인 의미가 있습니다. 이 기사는 mysqli_stmt :: attr_get 의 역할을 소개하고 SQL 주입을 방지하는 데 보조 역할을 설명합니다.
mysqli_stmt :: attr_get은 현재 명령문 객체의 속성 값을 얻는 데 사용되는 함수입니다. 주요 목적은 추가 처리 또는 디버깅을 위해 MySQLI_STMT 객체를 사용할 때 일부 내부 속성의 값을 확인하거나 얻는 것입니다.
구문은 다음과 같습니다.
public mysqli_stmt::attr_get(int $attribute): int|false
여기서 $ attribute는 mysqli_stmt_attr_update_max_length 와 같은 속성이며, 반환 값은 속성의 현재 값이거나 실패시 거짓을 반환합니다.
mysqli_stmt :: attr_get 자체는 SQL 주입을 직접 방지하지는 않지만 디버깅 도구와 비슷하지만 전처리 문을 사용하는 과정에서 개발자는 명령문 실행의 안전한 상태를 확인하거나 매개 변수 바인딩이 예상대로 효과적임을 확인하는 데 도움이 될 수 있습니다. 더 중요한 것은 개발자가 SQL을 직접 스 플라이 싱하는 고위험 작문 방법에서 멀리 떨어진 MySQLI_STMT 객체를 통해 운영하는 데 점차 익숙해집니다.
아래에서는 정기적 인 방법을 통해 SQL 주입을 방지하는 방법을 설명하고 속성 확인에 Attr_get을 사용하는 방법을 보여주기 위해 전처리 문을 사용하는 예를 사용합니다.
사용자 로그인 시스템이 있고 프론트 엔드가 사용자 이름을 제출한다고 가정하자 사용자 이름을 기반으로 데이터베이스의 레코드를 쿼리해야합니다.
$username = $_GET['username'];
$sql = "SELECT * FROM users WHERE username = '$username'";
$result = $mysqli->query($sql);
사용자가 입력 한 사용자 이름이 admin '인 경우 위의 SQL은 다음과 같이 스 플라이싱됩니다.
SELECT * FROM users WHERE username = 'admin' --'
이로 인해 암호 검증이 심어 심각한 보안 취약점을 유발합니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
$stmt->execute();
$result = $stmt->get_result();
// 선택 과목:속성 값을 확인하십시오
$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr !== false) {
// 출력 속성 값,명세서 동작을 디버그하거나 확인하는 데 사용됩니다
echo "현재 진술 속성:$attr";
}
위 코드에서 :
준비 () 사전 컴파일 된 SQL 템플릿을 만듭니다.
bind_param ()은 사용자 입력을 매개 변수로 바인딩하며 SQL 코드로 구문 분석되지 않습니다.
attr_get ()는 명령문 속성을 얻는 데 사용될 수 있으며, 이는 개발자가 일부 시나리오에서 명령문 객체의 현재 동작 상태를 판단하는 데 도움이 될 수 있습니다.
양식이 제출 된 페이지에서 https://m66.net/login.php가 제출 된 페이지에서 사용자 이름 매개 변수를 가져 와서 사용자 정보를 쿼리한다고 가정 해 봅시다.
<form action="https://m66.net/login.php" method="get">
<input type="text" name="username" />
<input type="submit" value="로그인하십시오" />
</form>
서버 측 처리 코드 :
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT id, email FROM users WHERE username = ?");
$stmt->bind_param("s", $_GET['username']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "사용자ID:" . $row['id'] . "<br>";
echo "우편:" . $row['email'] . "<br>";
}
// 사용 attr_get 속성을 확인하십시오
$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
if ($attr !== false) {
error_log("stmt 재산:$attr", 0);
}
mysqli_stmt :: attr_get은 SQL 주입을 직접 방지하는 함수는 아니지만 MySQLI_STMT 인터페이스를 사용하여 매개 변수화 된 쿼리의 맥락에서 명세서 객체를 이해하는 강력한 도구입니다. repary () 및 bind_param () 과 결합하여 보안 쿼리를 구축하는 데 도움이 될뿐만 아니라 코드의 디버그 가능성과 견고성을 향상시킵니다. 개발자는 항상 매개 변수화 된 쿼리를 사용하는 데 우선 순위를 부여하고 Att_get 과 같은 도구 기능을 사용하여 코드의 투명성 및 보안 제어를 더욱 향상시켜야합니다.