ВАЖНО
. Лучший способ предотвратить SQL Injection - использовать подготовленные выражения вместо экранирования , поскольку демонстрирует принятый ответ .
Существуют библиотеки, такие как Aura.Sql и EasyDB , которые позволяют разработчикам легче использовать подготовленные инструкции. Чтобы узнать больше о том, почему подготовленные операторы лучше в останавливать SQL-инъекцию , см. этот
mysql_real_escape_string()
обход и недавно зафиксированные уязвимости Unicode SQL Injection в WordPress .Предотвращение впрыска - mysql_real_escape_string ()
У PHP есть специально созданная функция для предотвращения этих атак. Все, что вам нужно сделать, это использовать функцию функции
mysql_real_escape_string
.
mysql_real_escape_string
берет строку, которая будет использоваться в запросе MySQL, и возвращает ту же строку со всеми попытками внедрения SQL безопасно сбежал. В принципе, это заменит эти неприятные кавычки ('), которые пользователь может ввести с помощью заменителя в MySQL, сэкономленная цитата.ПРИМЕЧАНИЕ: вы должны подключиться к базе данных, чтобы использовать эту функцию!
// Подключение к MySQL
$name_bad = "' OR 1'"; $name_bad = mysql_real_escape_string($name_bad); $query_bad = "SELECT * FROM customers WHERE username = '$name_bad'"; echo "Escaped Bad Injection:
" . $query_bad . "
"; $name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; $name_evil = mysql_real_escape_string($name_evil); $query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; echo "Escaped Evil Injection:
" . $query_evil;Более подробную информацию вы найдете в MySQL - SQL Injection Prevention .
continue
оператор без маркировки повторно выполнит от условия самое внутреннее while
или do
цикл, и от выражения обновления самого внутреннего for
цикл. Это часто привыкло к раннему оконечному обработка цикла, и, таким образом, избегайте глубоко вложенный if
операторы. В следующем примере continue
получит следующую строку, не обрабатывая следующее утверждение в цикле.
while (getNext(line)) {
if (line.isEmpty() || line.isComment())
continue;
// More code here
}
С маркировкой, continue
повторно выполнится от цикла с соответствующей маркировкой, а не самого внутреннего цикла. Это может использоваться для выхода из глубоко-вложенных-циклов, или просто для ясности.
Иногда continue
также используется в качестве заполнителя для создания пустого тела цикла более ясным.
for (count = 0; foo.moreData(); count++)
continue;
тот же оператор без маркировки также существует в C и C++. Эквивалент в Perl next
.
Этот тип потока управления не рекомендуется, но если Вы, так выберите, можно также использовать continue
для моделирования ограниченной формы [1 113]. В следующем примере эти continue
повторно выполнит пустое for (;;)
цикл.
aLoopName: for (;;) {
// ...
while (someCondition)
// ...
if (otherCondition)
continue aLoopName;
continue
отчасти похож goto
. Действительно ли Вы знакомы с break
? Легче думать о них по контрасту:
break
завершает цикл (переходы к коду ниже его).
continue
завершает остальную часть обработки кода в цикле для текущего повторения, но продолжает цикл.
Давайте посмотрим пример:
int sum = 0;
for(int i = 1; i <= 100 ; i++){
if(i % 2 == 0)
continue;
sum += i;
}
Это получило бы сумму только нечетных чисел от 1 до 100.
Если Вы думаете о теле цикла, поскольку подпрограмма, continue
вид подобных return
. То же ключевое слово существует в C и служит той же цели. Вот изобретенный пример:
for(int i=0; i < 10; ++i) {
if (i % 2 == 0) {
continue;
}
System.out.println(i);
}
Это распечатает только нечетные числа.
Обычно я вижу continue
(и break
) как предупреждение, что код мог бы использование некоторый рефакторинг, особенно если while
или for
объявление цикла сразу не в поле зрения. То же верно для return
посреди метода, но по немного отличающейся причине.
, Поскольку другие уже сказали, continue
перемещения следующему повторению цикла, в то время как break
перемещения из цикла включения.
Они могут быть бомбами замедленного действия обслуживания, потому что нет никакой непосредственной ссылки между continue
/ break
и цикл, который это продолжает/повреждает кроме контекста; добавьте внутренний цикл или переместите "кишки" цикла в отдельный метод, и Вы имеете скрытый эффект continue
/ break
сбой.
, по моему скромному мнению, лучше использовать их в качестве меры последней инстанции, и затем удостоверяться, что их использование группируется плотно в запуске или конце цикла так, чтобы следующий разработчик видел "границы" цикла на одном экране.
continue
, break
, и return
(кроме Одного Истинного Возврата в конце Вашего метода) всю осень в общую категорию "скрытого GOTOs". Они помещают цикл и функциональное управление в неожиданных местах, которое тогда в конечном счете вызывает ошибки.
continue
должно быть в цикле Иначе это showsThe ошибка ниже:
Продолжаются вне цикла