>  기사  >  백엔드 개발  >  PHP 양식에서 SQL 주입 공격을 방지하는 방법은 무엇입니까?

PHP 양식에서 SQL 주입 공격을 방지하는 방법은 무엇입니까?

WBOY
WBOY원래의
2023-08-25 19:45:381102검색

PHP 양식에서 SQL 주입 공격을 방지하는 방법은 무엇입니까?

PHP 양식에서 SQL 주입 공격을 방지하는 방법은 무엇입니까?

SQL 주입 공격은 웹 개발에서 매우 일반적이고 위험한 보안 취약점입니다. 공격자는 이 취약점을 이용하여 데이터베이스에 악성 코드를 주입하여 데이터베이스의 무결성을 파괴하고 민감한 정보까지 탈취합니다. PHP 양식에서 SQL 주입 공격을 방지하는 주요 방법은 사용자가 입력한 데이터를 엄격하게 필터링하고 인코딩하는 것입니다. 이 문서에서는 코드 예제를 통해 SQL 주입 공격을 방지하는 방법을 자세히 설명합니다.

1. 준비된 문 사용

전처리된 문은 SQL 문을 실행하기 전에 컴파일 및 구문 분석을 위해 데이터베이스 파서로 보내는 기술입니다. 매개변수화된 쿼리를 사용하여 사용자가 입력한 데이터를 SQL 문과 분리하므로 SQL 주입 공격을 효과적으로 방지할 수 있습니다. PHP의 PDO에서는 준비된 문을 사용하는 방법을 제공합니다.

// 连接数据库
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$password = 'password';

try {
    $pdo = new PDO($dsn, $username, $password);
    // 设置错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo '数据库连接失败:' . $e->getMessage();
}

// 准备SQL语句
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');

// 绑定参数
$stmt->bindParam(':username', $username);

// 执行查询
$stmt->execute();

// 获取结果
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 输出结果
foreach($result as $row) {
    echo $row['username'];
}

위 코드에서는 매개변수를 사용하는 <code>prepare() 메서드를 통해 SQL 문을 준비합니다. :username은 사용자가 입력한 사용자 이름을 대체합니다. 그런 다음 bindParam() 메서드를 통해 실제 사용자 이름을 매개 변수에 바인딩하고 마지막으로 쿼리를 실행하여 결과를 얻습니다. 이런 방식으로 사용자 입력이 무엇이든 SQL 문에는 영향을 미치지 않습니다. prepare()方法准备了一个SQL语句,其中使用了一个参数:username来代替用户输入的用户名。然后,通过bindParam()方法将实际的用户名绑定到参数上,最后执行查询并获取结果。这样,无论用户输入如何,都不会对SQL语句造成影响。

二、使用过滤函数

PHP提供了一些过滤函数,用于过滤和清理用户输入的数据。这些函数可以帮助我们去除输入字符串中的特殊字符和SQL关键字,从而防止SQL注入攻击。其中,mysqli_real_escape_string()是一种常用的过滤函数,示例如下:

// 连接数据库
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test";

$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查连接是否成功
if (!$conn) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 过滤用户输入数据
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

// 执行查询
$sql = "SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}'";
$result = mysqli_query($conn, $sql);

// 处理结果
if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {
        echo "用户名为: " . $row["username"];
    }
} else {
    echo "用户名或密码错误";
}

// 关闭连接
mysqli_close($conn);

在上面的代码中,我们使用mysqli_real_escape_string()

2. 필터 기능 사용

PHP는 사용자가 입력한 데이터를 필터링하고 정리하기 위한 몇 가지 필터 기능을 제공합니다. 이러한 함수를 사용하면 입력 문자열에서 특수 문자와 SQL 키워드를 제거하여 SQL 주입 공격을 방지할 수 있습니다. 그 중 mysqli_real_escape_string()은 흔히 사용되는 필터링 함수입니다. 예는 다음과 같습니다. 🎜rrreee🎜위 코드에서는 mysqli_real_escape_string() 함수를 사용하여 필터링합니다. 사용자 입력을 이름과 비밀번호로 필터링하고 필터링된 문자열을 SQL 문에 연결합니다. 이런 방식으로 입력 내용에 특수 문자나 SQL 키워드가 포함되어 있어도 SQL 주입 공격을 피하기 위해 이스케이프됩니다. 🎜🎜요약하자면, PHP 형식에서 SQL 주입 공격을 방지하는 방법은 여러 가지가 있으며, 그 중 준비된 문과 필터 기능을 사용하는 것이 더 일반적이고 효과적인 방법입니다. 어떤 방법을 사용하든 웹사이트 보안과 데이터 무결성을 보장하기 위해 사용자가 입력한 데이터를 엄격하게 필터링하고 인코딩해야 합니다. 동시에 개발자는 정기적인 보안 검토 및 취약성 검사를 수행하여 가능한 보안 취약성을 즉시 수정하고 웹사이트와 사용자의 정보 보안을 보호해야 합니다. 🎜

위 내용은 PHP 양식에서 SQL 주입 공격을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.