Если пользовательский ввод не обрабатывается правильно и вставлен в 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):
]]это общий подход, который работает со всеми поддерживаемыми драйверами базы данных. Вот пример его использования:
]
]mysqli (MySQL Улучшенное расширение):
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);
foreach ($stmt as $row) {
// 处理行
}
execute_query () $ result = $ db-> execute_query ('select * из сотрудников, где имя =?', [$ name]); while ($ row = $ result-> fetch_assoc ()) { // Линия обработки }
для Php 8.1 и ниже: ]
$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()) {
// 处理行
}
]
]]
При установлении соединения важно отключить моделирование операторов предварительной обработки для повышения производительности и безопасности. ]
$ 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