로그인 페이지 구성 시, 무차별 대입 공격을 막기 위하여 5번의 시도 시 ip를 블럭하는 방법이다.
로그인 시도 한 ip를 특정 테이블에 기록하고 1시간 내에 5번의 실패 시 해당 ip를 블록 테이블에 저장한다.
<?php
// MySQL 연결 정보
$servername = "localhost";
$username = "username";
$password = "password";
$database = "database";
// 사용자 IP 주소 가져오기
$ip_address = $_SERVER['REMOTE_ADDR'];
// MySQL 연결
$conn = new mysqli($servername, $username, $password, $database);
// 연결 오류 확인
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 사용자 로그인 시도를 로그테이블에 기록
$sql = "INSERT INTO login_attempts (ip_address) VALUES ('$ip_address')";
$conn->query($sql);
// 마지막 1시간 동안 사용자의 로그인 시도 횟수 가져오기
$sql = "SELECT COUNT(*) AS attempt_count FROM login_attempts WHERE ip_address = '$ip_address' AND login_time > DATE_SUB(NOW(), INTERVAL 1 HOUR)";
$result = $conn->query($sql);
$row = $result->fetch_assoc();
$attempt_count = $row["attempt_count"];
// 로그인 시도 횟수가 5번 이상이면 IP를 차단
if ($attempt_count >= 5) {
$sql = "INSERT INTO blocked_ips (ip_address) VALUES ('$ip_address')";
$conn->query($sql);
echo "IP 주소가 차단되었습니다.";
} else {
echo "로그인 시도: $attempt_count 번";
}
// MySQL 연결 종료
$conn->close();
?>
로그인 페이지에는 아래 코드를 참고해서 블록 테이블에서 차단된 ip를 읽어와서 실제로 차단하는 소스코딩을 해야한다.
<?php
// MySQL 연결 정보
$servername = "localhost";
$username = "username";
$password = "password";
$database = "database";
// 사용자 IP 주소 가져오기
$ip_address = $_SERVER['REMOTE_ADDR'];
// MySQL 연결
$conn = new mysqli($servername, $username, $password, $database);
// 연결 오류 확인
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 차단된 IP 주소 목록 가져오기
$sql = "SELECT * FROM blocked_ips WHERE ip_address = '$ip_address'";
$result = $conn->query($sql);
// 차단된 IP 주소인 경우 접속 차단
if ($result->num_rows > 0) {
die("접속이 차단되었습니다.");
}
// MySQL 연결 종료
$conn->close();
?>
