$name = strip_tags(htmlspecialchars(addslashes(($_POST['name']))))
$escape = mysqli_real_escape_string($connection, $name);
$sql = "INSERT INTO `users` (`name`) VALUES ('$escape')";
$sqlquery = mysqli_query($connection, $sql);if (isset($_GET['id'])) {
$id = (int)$_GET['id']; // тут еще можно использовать mysqli_real_escape_string или htmlspecialchars, но не вижу смысла, так как это (int).
}
Кажется, придется переписывать весь сайт
А в чем уязвимость запроса, который приведен в вопросе?
Подготавливаемые запросы защищают от SQL-инъекций на 100%?
$id = (int)$_GET['id'];
$sql = "SELECT id FROM `users` WHERE id='$id'";
$query = mysqli_query($link, $sql);$id = 123;
$sql = "SELECT id FROM `users` WHERE id='$id'";
$query = mysqli_query($link, $sql);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
$code = 'DEU'; // это string (s)
$language = 'Bavarian'; // тоже string
$official = '$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a'; // А как быть с хешем пароля?
$percent = 'username123'; // А как быть с этим?
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('ss??', $code, $language, $official, $percent);
$stmt->execute();
$stmt->close();
$mysqli->close();$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
$code = htmlspecialchars($_POST['text1']);// 123 - int
$language = htmlspecialchars($_POST['text2']); // abc - string
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?)");
$stmt->bind_param('is' $code, $language);
$stmt->execute();
$stmt->close();
$mysqli->close();
А какой стиль программирования лучше и удобнее для подготавливаемых запросов? ООП или процедурный?
2. Как подготовить данные, которые будут содержать цифры, буквы, символы?
$official = '$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a';$official = '$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a';3. От XSS нужно защищаться так?
4. А стоит ли использовать mysqli_real_escape_string, addslashes, strip_tags для $_POST['text']? (Перед подготавливаемым запросом)
error_reporting(0); //чтобы не узнали имя таблицы
Он ведь не знает ее названия
А еще с помощью preg_replace можно удалить фразы из строки
Но меня интересует именно тот запрос, который приведен в вопросе
Для ситуаций, когда в проекте надо перейти на использование другой базы данных, PDO позволит сделать процесс прозрачным. Все, что нужно будет сделать - изменить строку соединения и несколько запросов, если какие-либо методы не поддерживаются новой базой данных. В случае с MySQLi придется переписывать весь код, включая запросы
PDO или mysqli - не важно.
1. это шутка, сама форма ответа на это жирно намекает
2. это Маяковский, я так не смогу
В частности подготовленные запросы с PDO лучше, как минимум.Обоснуйте.
Обоснуйте.
$params = array(':username' => 'test', ':email' => $mail, ':last_login' => time() - 3600);
$pdo->prepare('
SELECT * FROM users
WHERE username = :username
AND email = :email
AND last_login > :last_login');
$pdo->execute($params);$query = $mysqli->prepare('
SELECT * FROM users
WHERE username = ?
AND email = ?
AND last_login > ?');
$query->bind_param('sss', 'test', $mail, time() - 3600);
$query->execute();
Ну тогда и наличие ООП как в mysqli так и в php в целом - это вкусовщина.
Есть факт, что вариант с именованием параметров более удобен и безопасен (в плане ошибок описок)