Внимание: примерный код этого ответа (например, примерный код вопроса) использует расширение PHP
mysql
, которое устарело в PHP 5.5.0 и полностью удалено в PHP 7.0.0.Если вы используете последнюю версию PHP, опция
mysql_real_escape_string
, описанная ниже, больше не будет доступна (хотяmysqli::escape_string
является современным эквивалентом). В настоящее время опцияmysql_real_escape_string
имеет смысл только для устаревшего кода на старой версии PHP.У вас есть два варианта - экранирование специальных символов в вашем
unsafe_variable
или использование параметризованный запрос. Оба будут защищать вас от SQL-инъекций. Параметрированный запрос считается лучшей практикой, но для его использования потребуется переходить на более новое расширение mysql в PHP.Мы рассмотрим нижнюю строку удара, которая будет первой.
//Connect $unsafe_variable = $_POST["user-input"]; $safe_variable = mysql_real_escape_string($unsafe_variable); mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')"); //Disconnect
См. также информацию о функции
mysql_real_escape_string
.Чтобы использовать параметризованный запрос, вам нужно использовать MySQLi , а не функции MySQL . Чтобы переписать ваш пример, нам понадобится что-то вроде следующего.
prepare("INSERT INTO table (column) VALUES (?)"); // TODO check that $stmt creation succeeded // "s" means the database expects a string $stmt->bind_param("s", $unsafe_variable); $stmt->execute(); $stmt->close(); $mysqli->close(); ?>
Ключевая функция, которую вы хотите прочитать, будет
mysqli::prepare
.Также, как предложили другие, вы можете сочтет полезным / легче повысить уровень абстракции с помощью чего-то вроде PDO .
Обратите внимание, что случай вы спросили об этом довольно просто, и что более сложные случаи могут потребовать более сложных подходов. В частности:
- Если вы хотите изменить структуру SQL на основе пользовательского ввода, параметризованные запросы не помогут, и требуемое экранирование не распространяется на
mysql_real_escape_string
. В этом случае вам лучше было бы пропускать вход пользователя через белый список, чтобы обеспечить доступ только «безопасных» значений.- Если вы используете целые числа от пользовательского ввода в состоянии и берете
mysql_real_escape_string
, вы столкнетесь с проблемой, описанной в Polynomial в комментариях ниже. Этот случай более сложный, поскольку целые числа не будут окружены кавычками, поэтому вы можете справиться, подтвердив, что пользовательский ввод содержит только цифры.- Есть, вероятно, другие случаи, о которых я не знаю. Вы можете найти , этот является полезным ресурсом для некоторых более тонких проблем, с которыми вы можете столкнуться.
const_iterator
с не позволяют Вам изменять значения, на которые они указывают на, регулярный iterator
, с делают.
Как со всеми вещами в C++, всегда предпочитайте const
, если нет серьезное основание использовать регулярные итераторы (т.е. Вы хотите использовать то, что они не const
для изменения указанного значение).
Они должны в значительной степени быть очевидными. Если итератор указывает на элемент типа T, то const_iterator указывает на элемент типа 'на константу T'.
Это в основном эквивалентно типам указателей:
T* // A non-const iterator to a non-const element. Corresponds to std::vector<T>::iterator
T* const // A const iterator to a non-const element. Corresponds to const std::vector<T>::iterator
const T* // A non-const iterator to a const element. Corresponds to std::vector<T>::const_iterator
итератор константы А всегда указывает на тот же элемент, таким образом, итератор сам является константой, Но элемент, на который это указывает, не должен быть константой, таким образом, элемент, на который это указывает, может быть изменен. const_iterator является итератором, который указывает на элемент константы, поэтому в то время как сам итератор может быть обновлен (увеличенный или постепенно уменьшенный, например), элемент, на который это указывает, не может быть изменен.
Используйте const_iterator каждый раз, когда Вы можете, использовать итератор , когда у Вас нет никакого другого выбора.
(как другие сказали), const_iterator, не позволяет Вам, изменяют элементы, на которые это указывает, это полезно в методах класса константы. Это также позволяет Вам выражать свое намерение.