[БЕЗ_ЗВУКА] В этом видео мы поговорим про тему, которая не относится непосредственно к нашему курсу, но про которую нужно говорить всегда и почаще. Называется это sql-инъекция. Давайте рассмотрим следующий код. Вот у нас есть какая-то форма, давайте сначала посмотрим на форму, где у нас есть логин и пароль. Мы вводим один пароль, авторизуемся, и все вроде бы хорошо. Но в чем подвох? Мы добавляем параметр руками, мы подставляем этот параметр руками в запрос, фактически без экранирования. Мы думаем, если там встретится кавычка, то я поставлю кавычку, и все будет хорошо, на случай, если в параметре несколько пробелов. Но давайте посмотрим, к чему это приводит. Вот наша форма, я ввел user, который реально существует, нажал login. Итак, вот мой запрос, который получился у меня. Я достаю id, login из таблицы пользователей. Все хорошо, user подставился, кавычки есть, все нормально. Запись нашлась: да, действительно, id 1, login user. Но давайте посмотрим вариант с sql-инъекцией. Итак, я выдал какую-нибудь страшную штуку. 404 or login = admin. И нажму кнопку login. И теперь вроде бы у меня не должно быть такого пользователя, я вроде бы там кавычки какие-то вводил. Но что на самом деле произошло? Вот параметр, который я ввел. Обратите внимание, тут нет открывающейся кавычки и закрывающейся. И вот эта кавычка закрыла то, что я писал, а дальше уже мой запрос. И поэтому вариант, когда я руками подставляю параметру запрос, он нашел у меня пользователя admin, в то время как вариант с плейсходлерами, он корректно экранировал значение, и там ничего не нашлось. Давайте взглянем на код еще раз. Вот вариант с sql-инъекцией. Мы подставляем значение руками в sql-запрос через Sprintf. В принципе, это было бы аналогично, как если бы мы написали вот так, и тут был бы не тот логин. Вот так. То же самое. Но так делать нельзя. Просто запомните. Никогда не надо подставлять значения в sql-запрос руками без экранирования корректного. Поэтому появляется вопрос, каким образом произвести корректное экранирование параметров. В случае с sql в базах данных почти везде поддерживаются плейсхолдеры. В MySQL это символ вопроса, и весь запрос сразу у вас уходит в QueryRow. Я не делаю предварительный запрос, если он мне нужен, а сам параметр, который я хочу подставить вместо знака вопроса, он передается уже в QueryRow. QueryRow — это variadic функция, то есть она принимает переменное число аргументов, в данном случае они названы как args. И там принимается пустой интерфейс, то есть вы можете передать туда любое значение. Поэтому просто запомните: если вы хотите подставить какое-то значение в sql, всегда используйте плейсхолдеры. Это обезопасит вас от очень многих проблем, вызванных sql-инъекциями, потому что это самая распространенная уязвимость в современных веб-приложениях.