Имеете хорошее представление о том, что вы хотите от пользователя.
Вы хотите, чтобы они указали порядок возрастания / убывания?Это перечисление (или логическое значение), а не часть запроса SQL:
$query = "SELECT [...] ORDER BY field " . escape($_GET['sortOrder']); //wrong
Это неправильно независимо от того, сколько вы экранируете и очищаете их строку, потому что это не способ проверки перечисления.Сравните:
if ($_GET['sortOrder'] == 'desc') {
$ascending = false;
} else {
$ascending = true;
}
if ($ascending) {
...
} else {
...
}
... что не требует обсуждения экранирования строк или внедрения SQL, поскольку все, что вам нужно от пользователя, - это ответ да / нет (или возрастание / убывание).
Вы хотите, чтобы они оставили комментарий?Зачем запрещать теги HTML?Что если пользователь захочет ввести HTML-код?
Опять же, вы хотите от них, скажем, «текст ... любой текст с максимальной длиной 1024 символов *».Какое это имеет отношение к SQL или инъекциям?Ничего:
$text = $_POST['commentText'];
if (mb_strlen($text, ENCODING) <= 1024) {
//valid!
}
Значение в базе данных должно отражать то, что пользователь ввел дословно;не переведено, не сбежало.Допустим, вы удалили весь HTML из комментария.Что происходит, когда вы решаете отправить комментарии куда-нибудь в формате JSON?Вы также удаляете управляющие символы JSON?А как насчет другого формата?Что произойдет, если HTML вводит тег с именем «:)»?Вы обходите свою базу данных, убирая смайлики из всех комментариев?
Ответ - нет, так как вы не хотите HTML-безопасный, JSON-безопасный, какой-то странный формат с улыбкой-безопасныйвход от пользователя.Вам нужен текст длиной не более 1024 символов.Проверьте это.Сохраните это.
Теперь отображаемая часть сложнее.Чтобы отобразить:
<b>I like HTML "tags"
в HTML, вам нужно написать что-то вроде:
<b>I like HTML "tags"
В JSON вы должны сделать:
{ "I like HTML \"tags\" }
ТоВот почему вы должны использовать свои языковые средства для экранирования данных , когда вы их используете .
То же самое, конечно, относится и к SQL, поэтому вы должны экранировать данные при использовании простыхфункции запроса, такие как mysql_query()
в PHP.(Параметризованные запросы, которые вы действительно должны использовать, с другой стороны, не требуют экранирования.)
Сводка
Имейте действительно хорошее представление о том, что вы хотите использовать в качестве входных данных, помнячто вам почти никогда не понадобится, скажем, «HTML-безопасный текст».Подтвердите против этого.Escape, когда это необходимо, что означает экранирование HTML при отправке в браузер, SQL при отправке в базу данных и т. Д.
*: Вы также должны определить, что означает здесь «символ».UTF-8, например, может использовать несколько байтов для кодирования кодовой точки.Означает ли «символ» «байт» или «кодовая точка Unicode»?