Является ли метод, который я использую для вставки данных с помощью MySQLi? Он работает, но достаточно ли он безопасен?
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
$login = trim($login);
$password = trim($password);
$result2=mysqli_query($db,"INSERT INTO users (login,password) VALUES('$login','$password')");
Всякий раз, когда вы взаимодействуете с базой данных внутри php
вам нужно иметь в виду контрольный список:
Настройте соединение правильно, например, убедитесь, что при использовании pdo
установите режим ошибки в исключение и скажите ему не подражать подготовленным операторам. Для установки атрибутов подключения используйте следующий код:
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Используйте готовые инструкции и параметризованные запросы при извлечении данных.
Использование mysqli:
$stment = $dbConnection->prepare('SELECT * FROM users WHERE name = ?');
$stment->bind_param('s', $name);
$stment->execute();
$result = $stment->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}
Использование PDO:
$stment = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stment->execute(array('name' => $name));
foreach ($stment as $row) {
// do something with $row
}
Идея готовых запросов очень проста - запрос и данные отправляются на SQL-сервер отдельно. Когда мы отправляем запрос базы данных вместе с данными, данные могут использоваться для выполнения потенциально вредоносного запроса. Для получения дополнительной информации см. Этот ответ.
Если вы хотите динамически добавлять идентификаторы и ключевые слова синтаксиса, используйте белый список. В основном это проверка того, является ли пользовательский ввод ожидаемым, например:
$orders = array("name","price","qty"); //field names
$key = array_search($_GET['sort'],$orders)); // see if we have such a name
$orderby = $orders[$key]; //if not, first one will be set automatically. smart enuf :)
$query = "SELECT * FROM 'table' ORDER BY $orderby"; //value is safe
mysqli_real_escape_string
, если вы mysqli_real_escape_string
то не используете подготовленные операторы. Используйте PDO
. Считается более безопасным, чем устаревший MySqli.
Вы также можете использовать следующую функцию для одной и той же вещи. Вы можете подготовить свою окончательную строку, которая непосредственно используется в запросе базы данных со следующей функцией. Эта функция будет заботиться почти обо всех вещах, которые препятствуют внедрению sql и очищают вредоносный или нежелательный контент от ваших входов.
function cleanInputs($data) {
$clean_input = array();
if (is_array($data)) {
foreach($data as $k = > $v) {
$clean_input[$k] = cleanInputs($v);
}
} else {
if (get_magic_quotes_gpc()) {
$data = trim(stripslashes($data));
}
$data = strip_tags($data);
$clean_input = trim($data);
}
return $clean_input;
}
Все зависит от требования, которое вы можете даже модифицировать определение или логику соответственно.
<
, что дает очень неожиданные результаты.