Каково различие между const_iterator и итератором неконстанты в STL C++?

Внимание: примерный код этого ответа (например, примерный код вопроса) использует расширение 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 в комментариях ниже. Этот случай более сложный, поскольку целые числа не будут окружены кавычками, поэтому вы можете справиться, подтвердив, что пользовательский ввод содержит только цифры.
  • Есть, вероятно, другие случаи, о которых я не знаю. Вы можете найти , этот является полезным ресурсом для некоторых более тонких проблем, с которыми вы можете столкнуться.
117
задан WeZZard 2 April 2017 в 03:48
поделиться

4 ответа

const_iterator с не позволяют Вам изменять значения, на которые они указывают на, регулярный iterator, с делают.

Как со всеми вещами в C++, всегда предпочитайте const, если нет серьезное основание использовать регулярные итераторы (т.е. Вы хотите использовать то, что они не const для изменения указанного значение).

104
ответ дан Dominic Rodger 24 November 2019 в 02:09
поделиться

Они должны в значительной степени быть очевидными. Если итератор указывает на элемент типа 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 является итератором, который указывает на элемент константы, поэтому в то время как сам итератор может быть обновлен (увеличенный или постепенно уменьшенный, например), элемент, на который это указывает, не может быть изменен.

38
ответ дан jalf 24 November 2019 в 02:09
поделиться

Используйте const_iterator каждый раз, когда Вы можете, использовать итератор , когда у Вас нет никакого другого выбора.

5
ответ дан Naveen 24 November 2019 в 02:09
поделиться

(как другие сказали), const_iterator, не позволяет Вам, изменяют элементы, на которые это указывает, это полезно в методах класса константы. Это также позволяет Вам выражать свое намерение.

0
ответ дан Trey Jackson 24 November 2019 в 02:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: