«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > PHP анти-SQL-инъекция: подробное объяснение предварительно скомпилированных утверждений и параметризованный запрос

PHP анти-SQL-инъекция: подробное объяснение предварительно скомпилированных утверждений и параметризованный запрос

Опубликовано в 2025-03-12
Просматривать:344

How Can Prepared Statements and Parameterized Queries Prevent SQL Injection in PHP?

Если пользовательский ввод не обрабатывается правильно и вставлен в SQL -запрос, возникает уязвимость инъекции SQL. Чтобы понять этот риск, рассмотрим следующий пример: ]

$ uncafe_variable = $ _post ['user_input']; mysql_query ("INSERT в` table` (`column`) values ​​('$ unceA_variable')");

$unsafe_variable = $_POST['user_input'];

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");

вставьте в `table` (` column`) values ​​('value'); это открывает дверь для злонамеренных атак в базе данных. ]

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Рекомендуемые методы безопасности для предотвращения инъекции SQL - это отделение данных от SQL, независимо от того, какую базу данных вы используете. Это означает обеспечение того, чтобы данные рассматривались как данные и никогда не интерпретируются как команда синтаксиком SQL. Наиболее эффективным способом достижения этого является использование предварительных операторов и параметризованных запросов.

]

операторы предварительной обработки и параметризованные запросы: ]]

оператор предварительной обработки включает в себя отправку запросов и параметров SQL на сервер базы данных отдельно, что позволяет базе данных обрабатывать свою комбинацию. Это предотвращает злонамеренные попытки инъекции SQL, гарантируя, что данные не проанализированы PHP до переноса.

]

Опции реализации: есть два основных метода для реализации заявлений о предварительной обработке:

]

]

]

PDO (объект данных PHP):

]]

это общий подход, который работает со всеми поддерживаемыми драйверами базы данных. Вот пример его использования:

  1. $ stmt = $ pdo-> Prepare ('select * от сотрудников, где имя =: name'); $ stmt-> execute (['name' => $ name]); foreach ($ stmt as $ row) { // Линия обработки }

    ]

    ]

    mysqli (MySQL Улучшенное расширение):
    $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
    $stmt->execute([ 'name' => $name ]);
    
    foreach ($stmt as $row) {
        // 处理行
    }
    execute_query ()
  2. для подготовки, параметров связывания и выполнять операторы SQL на одном шаге:
  3. $ result = $ db-> execute_query ('select * из сотрудников, где имя =?', [$ name]); while ($ row = $ result-> fetch_assoc ()) { // Линия обработки }

    для Php 8.1 и ниже: ]

    $ stmt = $ db-> Prepare ('select * от сотрудников, где имя =?'); $ stmt-> bind_param ('s', $ name); $ stmt-> execute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) { // Линия обработки }
    $result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
    while ($row = $result->fetch_assoc()) {
        // 处理行
    }
    ]

    , если вы используете базу данных, отличную от MySQL, существуют специфические альтернативы, такие как

    pg_prepare ()
    $stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
    $stmt->bind_param('s', $name); // 's' 表示'字符串'变量类型
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) {
        // 处理行
    }
    ]
правильные настройки соединения:

]] При установлении соединения важно отключить моделирование операторов предварительной обработки для повышения производительности и безопасности. ]

PDO Connection:

$ dbconnection = new pdo ('mysql: dbname = dbtest; host = 127.0.0.1; charset = utf8mb4', 'user', 'password'); $ dbconnection-> setattribute (pdo :: attr_emulate_prepares, false); $ dbconnection-> setattribute (pdo :: attr_errmode, pdo :: errmode_exception);

]

mysqli Connection:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
в заключение:

, реализуя операторы предварительной обработки и правильно настроив соединение, вы можете эффективно предотвратить атаки впрыска SQL и обеспечить безопасность и целостность приложений базы данных.

]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3