2010-08-05 3 views
1

Извините за то, что вы публикуете столько вопросов о nubbin на ASP.net, и я медленно их вижу.Запуск запросов, хороший дизайн здесь?

я выполнять запросы на моих страницах в качестве таковых (рабочий):

<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 
<script runat="server"> 

    // When the registration form is submitted 
    protected void regSubmit(object sender, EventArgs e) 
    { 
     // No erros so far 
     Boolean anyError = false; 
     string errorMessages = ""; 

     // Take all form values 
     string username = txtUsername.Text; 
     string password1 = txtPassword1.Text; 
     string password2 = txtPassword2.Text; 
     string emailAdd = txtEmail.Text; 

     // Verify that username is unique 
     using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConn"].ToString())) 
     { 
      SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM tblUsers WHERE username = '" + username + "'", cn); 
      cn.Open(); 
      SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); 
      rdr.Read(); 
      int result = int.Parse(rdr[0].ToString()); //read a value 
     } 


     statusLabel.Text = username; 
    } 
</script> 

Мой вопрос, это лучшая практика, я должен иметь «используя» блок и что внутренняя структура для каждого запроса Я бегу, или есть более простой способ сделать это? Кроме того, мне нужно закрыть что-нибудь или мусорщик позаботится об этом?

В классическом ASP я бы просто иметь

adoCon.execute("DELETE FROM TABLE") 

или

rsCommon.open("SELECT * FROM TABLE"), adoCon 
do until rsCommon.EOF 

rscommon.movenext 
loop 
rsCommon.close 

Tallyho! Спасибо за любую помощь! Что кажется намного проще и интуитивно понятным для меня.

+0

Абсолютно ничего не стоит о смешивании SQL внутри ваших .aspx-страниц, что является «лучшей практикой». –

+0

Следует сказать, что «УДАЛИТЬ ИЗ ТАБЛИЦЫ» удалит все содержимое этой таблицы. Не делайте этого :) –

+0

Из <% кажется, что вы помещаете свой код в файл aspx. В ASP.net веб-страница (.asp from asp) теперь разделена на aspx + aspx.cs и для разделения разметки HTML из кода C#/VB, как правило, лучше всего поместить код C# в aspx.cs/aspx.vb file – InSane

ответ

7

Том,

У вас есть несколько битов плохие вещи здесь происходит (извините, чтобы быть настолько тупым). Я хотел бы посмотреть на следующий:

  • Спараметрировать ваши запросы, чтобы смягчить атаки SQL инъекций
  • разделите логику из в DAL и БЛЛОВ слоев (или, по крайней мере, изолировать его для повторного использования в классы где возможно)

Кроме того, Boolean anyError = false; никогда не используется, но я предполагаю, что это для последующего использования.

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

идти с потоком

джим

+0

Человек, я полностью пропустил SQL-инъекцию, так как я был сфокусирован на использовании заявления. Хороший улов! +1 к вам. – David

+0

назовите меня обсессивным :) –

+0

Спасибо, я использовал простой пример, неиспользуемые переменные для последующего использования, и я буду использовать параметры SQL. –

3

Блок «использования» не ДОЛЖЕН иметь, но это хорошая идея. Он заботится об удалении объекта автоматически. (Тогда вы не должны помнить, чтобы закрыть его, избавиться от него, и т.д.)

Единственное изменение, которое я бы сделал это, я бы изменить линию

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConn"].ToString())) 

в

using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConn"].ToString(), CommandBehavior.CloseConnection)) 

, чтобы обеспечить правильное закрытие соединения.

Edit - добавил

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

Поскольку вы говорите, что являетесь новичком, я бы настоятельно рекомендовал вам ознакомиться с OWASP Top 10 и получить ОЧЕНЬ знакомый с ним. Есть много, чтобы узнать, но безопасность веб-приложений имеет решающее значение.

+0

+1 для вас тоже для ссылки OWASP –

0

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

+0

Багам нужно быстрее набирать ... – Fabian

0
  1. Работа с базой данных со страницы ASPX (или кода) не является хорошей практикой. Большинство профессиональных проектов начинаются с трехуровневого дизайна, где шрифт вызывает бизнес-уровень, из которого также абстрагируется слой данных. Подробнее о 3-уровневом дизайне here.

  2. Ваше соединение будет закрыто в конце используемого блока, что является самым простым способом справиться с этим.

1

Попробуйте войти в привычку использовать using, так как она снижает риск вы забудете закрыть соединение и начинают дубасить пределы пула соединений вашего сервера.

Если вы получаете только одно значение (например, SELECT COUNT), вы можете использовать ExecuteScalar, чтобы сделать вещи более компактными. Но, как Джим говорит, что выше, убедитесь, что вы параметризировать ваши запросы, в противном случае вы оставляете себе широко открыты для атак внедрения SQL:

SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM tblUsers WHERE username = @UserName", cn); 
cmd.Parameters.Add("@UserName", SqlDbType.VarChar).Value = username; 
cn.Open(); 

int result = Convert.ToInt32(new SqlCommand(sql, cn).ExecuteScalar()); 
2

using блок является наилучшей практикой. Тем не менее, использование конкатенации строк для создания вашего SQL-запроса просто неверно. Что делать, если кто-то вошел в ваше имя пользователя? :

«; DROP TABLE tblUsers; -

написать это вместо:

// When the registration form is submitted 
protected void regSubmit(object sender, EventArgs e) 
{ 
    // Verify that username is unique 
    using (SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDbConn"].ToString())) 
    using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM tblUsers WHERE username = @UserName", cn)) 
    { 
     cmd.Parameters.Add("@UserName", SqlDbType.VarChar, 50).Value = txtUserName.Text; 

     cn.Open(); 
     int result = (int)cmd.ExecuteScalar(); 
    } 

    statusLabel.Text = txtUserName.Text; 
} 

Кроме того, вы должны реально смотреть на использование системы членства ASP.Net для всех а не строить его самостоятельно. Членство, логин, аутентификация и другой код безопасности, как известно, легко построить неправильный, так что у вас есть что-то, что вы думаете, работает и не обнаружите, пока через год вас не разорвали шесть месяцев назад.