@User99

Как защититься от SQL инъекции в asp.net core? правильно ли я пишу?

Сегодня я задумался, а правильно ли я пишу, правильно ли я обращаюсь к БД?
ASP.NET Core
Язык: C#
БД: Postgresql
использую npgsql, Dapper

1) Создаю модель таблицы
public class Users
    {
        public int userid { get; set; }
        public int orgid { get; set; }
        public string login { get; set; }
        public string pass { get; set; }
        public string role { get; set; }
        public string m_product_coming { get; set; }
        public string m_product_realization { get; set; }
        public string m_analytics { get; set; }
    }


2) Создаю репозитори
public interface IUsersRepository<T> where T:BaseEntity
    {
        Task New(T add);
        Task Delete(int id);
        Task Update(T edit);
        Task<IList<T>> ShowAll(int orgid);
    }


public class ReposUsers:IUsersRepository<Users>
    {
        private string connectionString;

        public ReposUsers(IConfiguration configuration)
        {
            connectionString = configuration.GetValue<string>("DBInfo:ConnectionString");

        }

        internal IDbConnection Connection
        {
            get
            {
                return new NpgsqlConnection(connectionString);
            }
        }

        public async Task Delete(int id)
        {
            using(IDbConnection dbConnection = Connection)
            {
                await dbConnection.ExecuteAsync("DELETE FROM users WHERE userid=@userid", new { id = id });
                dbConnection.Dispose();
            }
        }

        public async Task New(Users add)
        {
            using(IDbConnection dbConnection = Connection)
            {
                await dbConnection.ExecuteAsync("INSERT INTO users " +
                    "(login,pass,role,m_product_coming,m_product_realization,m_analytics,orgid) VALUES " +
                    "(@login,@pass,@role,@m_product_coming,@m_product_realization,@m_analytics,@orgid)", add);
                dbConnection.Dispose();
            }
        }

        public async Task<IList<Users>> ShowAll(int orgid)
        {
           using(IDbConnection dbConnection = Connection)
            {
                var model = (await dbConnection.QueryAsync<Users>("SELECT * FROM users WHERE orgid=@orgid",new { orgid = orgid })).ToList();
                dbConnection.Dispose();
                return model;
            }
        }

        public async Task Update(Users edit)
        {
            using (IDbConnection dbConnection = Connection)
            {
                await dbConnection.ExecuteAsync("UPDATE users SET" +
                    "login=@login,pass=@pass,role=@role,m_product_coming=@m_product_coming," +
                    "m_product_realization=@m_product_realization,m_analytics=@m_analytics WHERE userid=@userid", edit);
                dbConnection.Dispose();
            }
        }
    }



Вопрос:
Правильно ли я делаю?
Нет ли ошибок?
Как можно защититься от инъекции?
Например, в php экранировали вводимую пользователем форму например htmlspecialchars, надо ли на net core так же делать?
  • Вопрос задан
  • 275 просмотров
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka Куратор тега ASP.NET
Токсичный шарпист
Сначала по пунктам, как ты делаешь:
1. Кривое именование. Dapper позволяет маппить имена колонок к именам свойств.
2. Похоже на ок, но стоит разбить интерфейс. Тк, скорее всего, не для всех сущностей будут нужны все эти методы.
Именование не ок.
dbConnection стоит переиспользовать.
dbConnection.Dispose руками писать не нужно, тк dbConnection и так завёрнут в using
SELECT * лучше не использовать
Правильно ли я делаю?

Не совсем

Нет ли ошибок?

Есть

Как можно защититься от инъекции?

Валидировать ввод.
Не уверен, проверяет ли даппер сам параметры, но вы используете параметризованные запросы - так что должно быть ок.
Если что - можете сами попытаться провести инъекцию (сами состаьте запрос или через burp suite)

Например, в php экранировали вводимую пользователем форму например htmlspecialchars, надо ли на net core так же делать?

Dapper сам должен это делать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы