Ошибка для простых кавычек при подключении к базе данных - PullRequest
0 голосов
/ 23 мая 2011

У меня есть следующий код для добавления нового пользователя:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

public class users
{

    public Sqlconnection myconn ()
    {
        return new ("data source=.; integrated security=true; initial catalog=test;");
    } 

    public bool insertuser(username, pass, type)
    {
        try {
            string query="insert into users (username, pass, type) values ( '"+username+"', '"+pass+"', '"+type+"');
            return true;
            SqlCommand mycommand = new SqlCommand (query, this.myconn);
            mycommand.Connection.Open();
            mycommand.ExecuteNonQuery();
            mycommand.Connection.Close();
            return true;
        }
        catch {
            return false;
        }
    }
}

теперь в форме, если пользователь вызывает этот метод

users user1 = new users();

if(user1.insertuser(txtusername.tex, txtpass.text, cbtype.text)==true)
{
    // BUG IS HERE IF USER WRITE  SOMETHING SO..   ANGEL'   (WITH THIS ')
    // MY CODE IS GOING TO HAVE A  BUG!
    // I QUIT THEM IN KEY PRESS BUT WHAT HAPPEND IF USERS MUST TO ADD SOMETHING AS
    // tic's 
    // what can i do for my code acept all?? and it doesn't have any bug?
    MessageBox.show("user added");
}

Ответы [ 2 ]

3 голосов
/ 23 мая 2011

Существует более одной проблемы с вашим кодом:

  • вторая строка в вашем примере кода return true;, что означает, что он не будет запускать ничего
  • параметров метода вДля InsertUsers не указан тип
  • не оставляйте соединение открытым, утилизируйте соединение после получения данных
  • используйте using, чтобы гарантировать закрытие / удаление соединения, даже если возникла исключительная ситуация
  • используйте параметризованный запрос.Вот почему: SQL-инъекция .
  • не перехватывает все исключения, SqlException только в этом случае

Пытался сделать это с нуля:

public static bool InsertUser(string userName, string password, string type)
{
    try
    {
        using (var connection = new SqlConnection("data source=.; integrated security=true; initial catalog=test;"))
        using (var command = connection.CreateCommand())
        {
            command.CommandText = "insert into users (username, pass, type) values (@username, @password, @type)";
            command.Parameters.AddWithValue("username", userName);
            command.Parameters.AddWithValue("password", password);
            command.Parameters.AddWithValue("type", type);
            connection.Open();
            command.ExecuteNonQuery();
        }
        return true;
    }
    catch (SqlException)
    {
        return false;
    }
}
3 голосов
/ 23 мая 2011

Вы переоткрыли атаки с использованием SQL-инъекций.

Не включайте извлеченные извне значения в ваш SQL.

Вместо этого используйте параметризованные запросы.

Код, который вы показали, в любом случае не скомпилируется (Sqlcommand vs SqlCommand), но прочитает эту страницу MSDN (или просто ищет информацию по параметризованным запросам или внедрению SQL) для получения дополнительной информации.

...