предотвращение внедрения SQL в Go с помощью fmt.Sprintf для собственного запроса

#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() .

Вопрос в том, насколько вы контролируете то, что возвращают эти функции? Основано ли их поведение на вводе пользователем? Если это так, то вы могли бы, например, защитить себя от атак с использованием инъекций, выполнив несколько простых шаблонов — например, если вы ожидаете имя, убедитесь, что ввод состоит только из букв и пробелов.

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

… если у меня много столбцов, я должен вводить вручную один за другим, это что-то, чтобы сделать его короче?

Я предлагаю задать отдельный вопрос по этому поводу, поскольку это отдельная проблема.