Единственный способ - правильно скрыть предоставленные пользователем данные. Другие указали несколько способов сделать это.
Есть еще один способ: подготовленные операторы и заполнители. Подготовленные операторы поддерживаются каждым современным интерфейсом базы данных PHP, включая mysqli и PDO .
Давайте использовать PDO в качестве демонстрации. Допустим, мы хотели обновить немного данных в таблице foo
, предоставленной пользователем.
$sql = 'UPDATE foo SET bar = ? WHERE user_id = ?';
$sh = $db->prepare($sql);
$sh->execute(array( $_POST['bar'], $_SESSION['user_id'] ));
Переменные в массиве, переданные в execute
, заменяют заполнители вопросительного знака в запросе. Когда это происходит, они автоматически экранируются и цитируются . Вам не нужно вручную избегать их, чтобы сделать их безопасными для помещения в базу данных!
С другой стороны, вам все равно нужно будет отфильтровать их для непредвиденного контента, такого как HTML, Javascript, буквы, где вы ожидаете цифры и т. Д. Обеспечение безопасности данных для вставки в базу данных - это только половина дела .