И версия jquery:
$('input').attr('required', true)
$('input').attr('required', false)
Я знаю, что это не подлежит сомнению, но, возможно, кто-то найдет это полезным:)
Это работает, но все равно будет уязвимым для инъекций?
blockquote>Да, ваш код ужасно уязвим для инъекций SQL.
I знаю, что я должен использовать параметризованные запросы, чтобы избежать инъекций SQL.
blockquote>Абсолютно да.
Мой вопрос: как я могу это сделать, когда передаю запрос как строковый параметр?
blockquote>Вы просто не должны передавать запрос как строковый параметр. Вместо этого вы должны передавать запрос в виде строкового параметра, содержащего заполнители, и значения для этих заполнителей:
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 }
То, что вы пытаетесь сделать, делает идеальный логический смысл, и я могу понять, почему вы пришли к этой реализации. Однако то, что вы пытаетесь сделать, очень опасно и, будучи новичком в ASP.NET, может не знать, что существует множество других доступных вам вариантов, которые упрощают и значительно упрощают управление вашими данными.
@iamkrillin намекнул на одну из таких технологий - Object Relational Mapping (ORM). Структура .NET на самом деле имеет поддержку первого класса для ORM, называемого Entity Framework . Я считаю, что причина, по которой он предположил, что вы заглядываете в ORM, заключается в том, что ваш дизайн на самом деле очень похож на принцип работы ORM. Они являются абстрагированными классами, которые представляют таблицы в вашей базе данных, которые можно легко запросить с помощью LINQ. Запросы LINQ автоматически параметризуются и избавляют вас от стресса в управлении безопасностью ваших запросов. Они генерируют SQL «на лету» (так же, как вы передаете строки вашему классу доступа к данным) и гораздо более гибки в том, как они могут возвращать данные (массивы, списки, вы называете это).
Однако один из недостатков ORM заключается в том, что они имеют довольно крутые кривые обучения. Более простой вариант (хотя и немного старше EF) заключается в использовании Typed Datasets. Типизированные наборы данных намного проще создавать, чем создавать ORM и, как правило, намного проще реализовать. Хотя они не так гибки, как ORM, они выполняют именно то, что вы пытаетесь сделать в простой, безопасной и уже решенной манере. К счастью, когда ASP.NET впервые выпустила обучающие видеоролики, в которых основное внимание уделялось типизированным наборам данных, и поэтому существует множество высококачественных свободно доступных видео / учебников , которые помогут вам быстро и быстро запустить.
Вы на правильном пути, и я действительно сделал то, что вы тоже ищете. Однако вместо того, чтобы просто передавать строку в вашу функцию, я передаю объект 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 );
}
Мое предложение: используйте orm. В настоящее время есть много вариантов
foreach (string item in values)
Возможно ли это? – Jeyhun 6 April 2014 в 22:49cmd.Parameters.AddWithvalue
наcmd.Parameters.AddWithValue
. – Jeyhun 6 April 2014 в 23:34