스토리지 XSS (크로스 사이트 스크립팅 공격)는 공격자가 악의적 인 스크립트를 제출하여 악의적 인 스크립트를 데이터베이스에 저장할 수있는 일반적인 보안 취약점으로, 다른 사용자가 데이터에 액세스 할 때 실행할 수 있습니다. 이러한 종류의 공격의 주요 문제는 악의적 인 스크립트가 서버 측에 저장되고 이후 요청에서 실행되며 일반적으로 사용자 세션 정보를 훔치거나 다른 악성 작업을 수행하는 데 사용된다는 것입니다.
이 공격을 방지하기 위해 데이터베이스에서 문자 인코딩이 올바르게 처리되고 악의적 인 코드가 실행되지 않도록해야합니다. mysqli :: get_charset은 데이터베이스 연결의 문자 인코딩을 확인하는 데 도움이되는 PHP 기능입니다. 인코딩 설정이 올바른지 확인하는 것은 XSS 공격을 방지하기위한 단계입니다.
mysqli :: get_charset 함수는 MySQLI Extension 라이브러리의 일부이며 현재 데이터베이스 연결의 문자 세트 (문자 인코딩)를 얻는 데 사용됩니다. 인코딩 불일치로 인한 잠재적 XSS 취약점은 문자 세트가 올바르게 설정되도록하여 불일치를 피할 수 있습니다.
$charset = $mysqli->get_charset();
리턴 값은 현재 연결에서 사용하는 문자 세트에 대한 정보를 포함하는 객체입니다.
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
// 연결이 성공했는지 확인하십시오
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
// 현재 데이터베이스 연결의 문자 세트를 가져옵니다
$charset = $mysqli->get_charset();
// 현재 문자 세트 설정을 출력하십시오
echo "현재 문자 세트는입니다: " . $charset->charset;
?>
문자 인코딩 설정에 따라 데이터가 응용 프로그램에서 데이터베이스로 전송되는 방법과 데이터가 데이터베이스에서 응용 프로그램으로 반환되는 방법을 결정합니다. 문자 인코딩이 잘못된 경우, 특히 사용자 입력을 처리 할 때는 차량 또는 코드 주입 공격으로 이어질 수 있습니다. 특히 저장된 XSS 공격의 경우 일관성이없는 인코딩으로 인해 악의적 인 코드가 잘못 실행될 수 있습니다.
올바른 인코딩 설정을 사용하면 사용자 입력에서 데이터베이스 스토리지 및 사용자 측면으로의 출력에 이르기까지 모든 것이 조작되거나 실행 가능한 스크립트로 해석되지 않도록합니다.
스토리지 XSS 공격을 방지하기위한 가장 중요한 단계는 다음과 같습니다.
데이터베이스 연결이 올바른 문자 세트를 사용하는지 확인하십시오.
데이터베이스에 연결할 때 올바른 문자 세트를 사용하는 것이 중요합니다. 문자 세트가 일치하지 않으면 악성 사용자 입력이 오류 처리되어 XSS 취약성을 유발할 수 있습니다. 현재 문자 세트 설정은 mysqli :: get_charset을 통해 확인할 수 있습니다.
사용자 입력의 적절한 필터링 및 탈출을 수행하십시오.
컨텐츠 사용자 입력 유형에 관계없이 적절한 필터링 및 탈출을 수행해야합니다. 특히 HTML 및 JavaScript 코드의 경우 실행되지 않은지 확인하십시오. HTMLSpecialchars () 또는 MySQLI_REAL_ESCAPE_STRING () 함수를 사용하여 입력을 피하십시오.
HTTP 헤더 설정 :
서버에서 반환 한 컨텐츠가 텍스트/HTML 과 같은 올바른 MIME 유형을 사용하는지 확인하십시오. 또한 브라우저가 문자를 올바르게 인코딩하는지 확인하려면 컨텐츠 유형을 UTF-8로 설정해야합니다.
매개 변수화 쿼리 사용 :
SQL 주입 방지는 XSS 공격을 방지하는 또 다른 중요한 조치입니다. 준비된 명령문을 사용하여 악의적 인 SQL 코드를 실행하는 것을 방지 할 수 있습니다.
데이터를 확인하고 정리하십시오.
사용자 입력을 데이터베이스에 저장하기 전에 확인하고 정리하는 것이 가장 좋습니다. 사용자 입력이 합법적인지 확인하고 잠재적 인 악성 코드를 정리하십시오.
다음은 인코딩이 올바르게 설정되고 XSS 공격을 방지하는 방법을 보여주는 완전한 예입니다.
<?php
// 데이터베이스에 연결하십시오
$mysqli = new mysqli("localhost", "username", "password", "database");
// 연결이 성공했는지 확인하십시오
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
// 현재 문자 세트 설정을 가져옵니다
$charset = $mysqli->get_charset();
echo "현재 문자 세트는입니다: " . $charset->charset . "<br>";
// 올바른 문자를 설정하십시오 utf8mb4
if (!$mysqli->set_charset("utf8mb4")) {
die("문자 세트를 설정할 수 없습니다: " . $mysqli->error);
}
// 사용자 입력을 얻고 처리합니다
$user_input = $_POST['user_input']; // 사용자 입력이 통과한다고 가정합니다 POST 옮기다
// 사용 htmlspecialchars() 예방하다 XSS
$safe_input = htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// 안전한 입력을 데이터베이스에 저장하십시오
$stmt = $mysqli->prepare("INSERT INTO users (user_input) VALUES (?)");
$stmt->bind_param("s", $safe_input);
$stmt->execute();
// 연결을 닫으십시오
$stmt->close();
$mysqli->close();
?>
이 예에서는 먼저 get_charset () 을 통해 현재 문자 세트 설정을 확인한 다음 UTF-8 인코딩이 SET_CHARSET ( "UTF8MB4")을 통해 데이터를 저장하고 표시하는 데 사용되는지 확인합니다. 한편, 사용자 입력을 처리 할 때는 htmlspecialchars ()를 사용하여 잠재적 XSS 공격을 방지합니다.
mysqli :: get_charset 함수를 사용하여 데이터베이스 연결의 문자 세트 설정을 확인하고 올바른 인코딩이 사용되는지 확인하면 스토리지 XSS 공격을 효과적으로 방지 할 수 있습니다. 동시에 적절한 입력 검증, 탈출 및 스토리지 측정을 결합하면 웹 애플리케이션의 보안을 극대화하고 잠재적 인 공격 위험을 피할 수 있습니다.