#database #go #prepared-statement #sql-injection
#База данных #Вперед #подготовленное заявление #sql-инъекция
Вопрос:
является ли этот запрос sql-инъекцией или плохим для инструкции вставки запроса
query := fmt.Sprintf("INSERT INTO users(%s) VALUES(%s) RETURNING user_id, otp",
repo.getColumns(), // returning users columns
repo.setValues(), // looping to create $1, $2 (depent length of users columns)
)
stmt, err := db.Prepare(query)
checkError(err)
defer func() {
if err = stmt.Close(); err != nil {
panic(err.Error())
}
}()
err = stmt.QueryRowContext(ctx,
user.Email,
user.CardID,
user.CardFee,
user.PhoneNumber,
user.Gender,
user.BirthDate,
user.BirthCityID,
user.Education,
user.MotherName,
user.MotherPhone,
user.PartnerPhone,
user.FamilyCardNumber,
user.Religion,
user.CitizenShip,
user.MaritalStatus,
user.SpouseCardID,
user.SpouseFullName,
user.SpouseBirthDate,
).Scan(amp;userData.ID, amp;userData.CardID)
вот repo.getColumns()
метод, который возвращает строку из столбцов пользователей и setValues()
является манипуляцией со строкой для создания $1, $2, …. из столбца length of users в методе getColumns()
будет ли это потенциальной безопасностью?? кроме того, в параметре QueryRowContext второй и так далее …. это ...interface{}
и если у меня много столбцов, я должен вводить вручную один за другим, это что-то, чтобы сделать его короче?
Комментарии:
1. Да, есть потенциал для внедрения SQL. Однако, насколько серьезна уязвимость, зависит от достоверности данных, интерполируемых в строку запроса.
2. как правильно и хорошо написать запрос? в моем случае @mkopriva
Ответ №1:
Возможность атаки sql-инъекцией заключается в значениях, возвращаемых вызовами функций repo.getColumns()
и repo.setValues()
.
Вопрос в том, насколько вы контролируете то, что возвращают эти функции? Основано ли их поведение на вводе пользователем? Если это так, то вы могли бы, например, защитить себя от атак с использованием инъекций, выполнив несколько простых шаблонов — например, если вы ожидаете имя, убедитесь, что ввод состоит только из букв и пробелов.
Вы также можете попытаться исключить любые специальные знаки, которые могут быть использованы для атаки с использованием инъекций и не ожидаются как часть имен столбцов значений.
… если у меня много столбцов, я должен вводить вручную один за другим, это что-то, чтобы сделать его короче?
Я предлагаю задать отдельный вопрос по этому поводу, поскольку это отдельная проблема.