Как вставить строку json в DB [duplicate]

И версия jquery:

$('input').attr('required', true)
$('input').attr('required', false)

Я знаю, что это не подлежит сомнению, но, возможно, кто-то найдет это полезным:)

6
задан John Saunders 7 July 2013 в 06:24
поделиться

4 ответа

Это работает, но все равно будет уязвимым для инъекций?

Да, ваш код ужасно уязвим для инъекций SQL.

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

Абсолютно да.

Мой вопрос: как я могу это сделать, когда передаю запрос как строковый параметр?

Вы просто не должны передавать запрос как строковый параметр. Вместо этого вы должны передавать запрос в виде строкового параметра, содержащего заполнители, и значения для этих заполнителей:

public static DataTable SqlDataTable(string sql, IDictionary<string, object> values)
{
    using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
    using (SqlCommand cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = sql;
        foreach (KeyValuePair<string, object> item in values)
        {
            cmd.Parameters.AddWithValue("@" + item.Key, item.Value);
        }

        DataTable table = new DataTable();
        using (var reader = cmd.ExecuteReader())
        {
            table.Load(reader);
            return table;
        }
    }
}

, а затем использовать вашу функцию следующим образом:

DataTable dt = SqlComm.SqlDataTable(
    "SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password",
    new Dictionary<string, object>
    {
        { "UserName", login.Text },
        { "Password", password.Text },
    }
);

if (dt.Rows.Count > 0)
{
   // do something if the query returns rows
}
13
ответ дан Gevo12321 20 August 2018 в 09:46
поделиться
  • 1
    Любая причина для downvote? – Darin Dimitrov 7 July 2013 в 15:07
  • 2
    Спасибо за помощь. Было много полезной информации от всех, но я решил, что я бы назвал это ответом, поскольку он напрямую связан с моей первоначальной целью. Однако я собираюсь изучить все предложения, чтобы узнать больше об этом процессе. Благодаря! – Cineno28 7 July 2013 в 17:04
  • 3
    @Darin Dimitrov, foreach (string item in values) Возможно ли это? – Jeyhun 6 April 2014 в 22:49
  • 4
    И, пожалуйста, измените cmd.Parameters.AddWithvalue на cmd.Parameters.AddWithValue. – Jeyhun 6 April 2014 в 23:34

То, что вы пытаетесь сделать, делает идеальный логический смысл, и я могу понять, почему вы пришли к этой реализации. Однако то, что вы пытаетесь сделать, очень опасно и, будучи новичком в ASP.NET, может не знать, что существует множество других доступных вам вариантов, которые упрощают и значительно упрощают управление вашими данными.

@iamkrillin намекнул на одну из таких технологий - Object Relational Mapping (ORM). Структура .NET на самом деле имеет поддержку первого класса для ORM, называемого Entity Framework . Я считаю, что причина, по которой он предположил, что вы заглядываете в ORM, заключается в том, что ваш дизайн на самом деле очень похож на принцип работы ORM. Они являются абстрагированными классами, которые представляют таблицы в вашей базе данных, которые можно легко запросить с помощью LINQ. Запросы LINQ автоматически параметризуются и избавляют вас от стресса в управлении безопасностью ваших запросов. Они генерируют SQL «на лету» (так же, как вы передаете строки вашему классу доступа к данным) и гораздо более гибки в том, как они могут возвращать данные (массивы, списки, вы называете это).

Однако один из недостатков ORM заключается в том, что они имеют довольно крутые кривые обучения. Более простой вариант (хотя и немного старше EF) заключается в использовании Typed Datasets. Типизированные наборы данных намного проще создавать, чем создавать ORM и, как правило, намного проще реализовать. Хотя они не так гибки, как ORM, они выполняют именно то, что вы пытаетесь сделать в простой, безопасной и уже решенной манере. К счастью, когда ASP.NET впервые выпустила обучающие видеоролики, в которых основное внимание уделялось типизированным наборам данных, и поэтому существует множество высококачественных свободно доступных видео / учебников , которые помогут вам быстро и быстро запустить.

0
ответ дан Daniel Szabo 20 August 2018 в 09:46
поделиться
  • 1
  • 2
    Является ли структура структуры плохим? – Ryan 7 July 2013 в 13:53
  • 3
    Да, это так плохо. – Darin Dimitrov 7 July 2013 в 13:54
  • 4
    @Emin, конечно, посмотрите на количество вопросов в StackOverflow о людях, имеющих проблемы с Entity Framework. Теперь просмотрите количество вопросов по StackOverflow о людях, имеющих проблемы с другими ORM. Затем подсчитайте. Чем больше число, тем хуже, и считаю, что EF является лидером в этом конкурсе на огромную величину :-) Но я даже не понимаю, почему мы спорим об ORM здесь. У ОП есть конкретный вопрос, который не имеет ничего общего с ORM. Речь идет о том, как избежать атак SQL-инъекций с помощью ADO.NET. – Darin Dimitrov 7 July 2013 в 14:31
  • 5
    @ ajax81 Это отличная помощь. Большое спасибо за ссылку на дополнительную информацию. Я определенно буду смотреть на все это. – Cineno28 7 July 2013 в 17:02

Вы на правильном пути, и я действительно сделал то, что вы тоже ищете. Однако вместо того, чтобы просто передавать строку в вашу функцию, я передаю объект SQL Command ... Таким образом, вы можете правильно построить все свои команды и параметры, а затем сказать ... здесь, запустите это, это готов к работе. Что-то вроде

public static DataTable SqlDataTable(SqlCommand cmd)
{
    using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))
    {  
        cmd.Connection = conn;   // store your connection to the command object..
        cmd.Connection.Open();
        DataTable TempTable = new DataTable();
        TempTable.Load(cmd.ExecuteReader());
        return TempTable;
    }
}

public DataTable GetMyCustomers(string likeName)
{
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "select * from SomeTable where LastName like "@someParm%";
    cmd.Parameters.Add( "whateverParm", likeName );  // don't have SQL with me now, guessing syntax

    // so now your SQL Command is all built with parameters and ready to go.
    return SqlDataTable( cmd );
}
0
ответ дан DRapp 20 August 2018 в 09:46
поделиться

Мое предложение: используйте orm. В настоящее время есть много вариантов

-2
ответ дан iamkrillin 20 August 2018 в 09:46
поделиться
  • 1
    Зачем использовать ORM, когда ADO.NET уже имеет все, что необходимо для предотвращения SQL-инъекции? ORM иногда может быть накладными расходами. – Darin Dimitrov 7 July 2013 в 13:45
  • 2
    @darindimitrov. Я не утверждаю этого, просто указывая, что то, что он делает, является точной проблемой, которую решают ORM. Конечно, может быть штраф за производительность (зависит от ORM), но это ничто по сравнению с ущербом, который может вызвать SQL-инъекция. Никогда не обращайте на них все выгоды производительности и все такое. Наконец, поскольку ОП упомянул, что он был «новым», Я решил предложить вариант, который более дружелюбен для кого-то, только начинающего – iamkrillin 7 July 2013 в 20:10
Другие вопросы по тегам:

Похожие вопросы: