Ниже приведен один из моих старых кодов. Он использует SQL CE
в качестве базы данных. Я хочу предотвратить внедрение sql в этот код.
Для предотвращения инъекции sql мне нужно параметризовать sql-запрос.
Я не знаю, как использовать эти параметры в коде.
Как я могу его пересмотреть?
SqlCeConnection con = new SqlCeConnection();
sqlcon.ConnectionString = @"Data Source=dbLogin.sdf;
string query = "select * from [Login] where username = @user AND password = @pass";
SqlCeCommand myCMD = new SqlCeCommand();
myCMD.Connection = sqlcon;
myCMD.CommandText = query;
myCMD.Parameters.Add("@user", Username.Text);
myCMD.Parameters.Add("@pass", Password.Text);
SqlCeDataAdapter sda = new SqlCeDataAdapter(query, con);
DataTable dt = new DataTable();
sda.Fill(dt);
if (dtbl.Rows.Count == 1)
{
Main objMain = new Main();
this.Hide();
objMain.Show();
}
else
{
MessageBox.Show("Invalid Username or Password", "Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
Я добавил свой язык программирования. Это С#.
Отвечает ли это на ваш вопрос? Почему мы всегда предпочитаем использовать параметры в операторах SQL?
@Larnu Я обновил свой пост. Я попытался параметризовать его. Как я могу заполнить данные, используя новый параметризованный запрос?
Почему вы используете AddWithValue
? Вопрос, на который я дал ссылку, показывает Parameters.Add
. Можем ли мы уже отказаться от использования AddWithValue()?, хотя теперь вы полностью изменили вопрос: ваш заголовок не отражает ваши новые цели.
На ваш новый вопрос, опять же, что вы не поняли в информации уже там?
@Larnu Я изменил это на Add()
. Когда я отлаживаю, он не может заполнить таблицу данных и выдает ошибку в строке sda.Fill(dtbl);
и говорит: 'A parameter is missing. [ Parameter ordinal = 2 ]'
Кроме того, в качестве примечания ваш код подразумевает, что вы храните пароли в виде открытого текста: никогда сделайте это. Солите и хэшируйте свои пароли, когда вы их сохраняете.
Вы не используете созданную вами команду SqlCeCommand SqlCeDataAdapter sda = new SqlCeDataAdapter(query, sqlcon);
— ссылка на myCommand
отсутствует, поэтому параметры в вашем запросе не разрешаются.
изменить на SqlCeDataAdapter sda = new SqlCeDataAdapter(myCommand);
Вы должны передать команду с определенными и заполненными параметрами в SqlCeDataAdapter, вы пропустили это.
измените свой код на приведенный ниже,
SqlCeConnection sqlcon = new SqlCeConnection();
sqlcon.ConnectionString = @"Data Source=dbLogin.sdf; password =rss900";
string query = "select * from [tblLogin] where username = @user AND password = @pass";
SqlCeCommand myCommand = new SqlCeCommand();
myCommand.Connection = sqlcon;
myCommand.CommandText = query;
myCommand.Parameters.Add("@user", txtUsername.Text);
myCommand.Parameters.Add("@pass", txtPassword.Text);
SqlCeDataAdapter sda = new SqlCeDataAdapter(myCommand);
DataTable dtbl = new DataTable();
sda.Fill(dtbl);
if (dtbl.Rows.Count == 1)
{
Main objfrmMain = new Main();
this.Hide();
objfrmMain.Show();
}
else
{
MessageBox.Show("Invalid Username or Password", "Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
Вам нужно пометить язык программирования, который вы используете. Тогда дайте нам знать, что насчет обилия документации и статей, которые вы не поняли по этому вопросу; параметризация - очень хорошо задокументированная тема.