2016-06-27 3 views
3

Выполняю проверку, добавляя ученика из приложения. Если я запускаю следующий запросСложность выполнения SQL-запроса

SELECT ID FROM Student WHERE Name =' " '+str+' " ' 

Он будет генерировать следующие ошибки:

Invalid column name 'str'.

И мое приложение будет генерировать DBException.

Как я могу решить эту проблему?

Редактировать

String SName=txtBox1.Text; 

String sql="select id from student where name = ' "+SName.Trim()+" ' "; 

SqlConnection connection = null; 
SqlDataReader reader = null; 
try 
{ 
    connection = GetConnection(); 
    SqlCommand command = new SqlCommand(sql, connection); 
    if (_sqltransection != null) 
    { 
     command.Transaction = _sqltransection; 
    } 
    reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
}    
catch (SqlException ex) 
{ 
    throw new DBException(ex); 
} 

Где txtBox.Text=" '+str+' "

+0

Вам нужно добавить еще несколько одиночные кавычки, чтобы сделать его в виде строки, иначе он будет анализироваться как 'SELECT, ID FROM Student WHERE Name = divyesh' –

+0

Plus ваш код выглядит он подвержен sql injection –

+0

Что такое divyesh? Это имя столбца, переменная/параметр или (неудачный) строковый литерал? – jarlh

ответ

1

Действительно, вы посылаете в ваших DBMS этот запрос

SELECT ID FROM Student WHERE Name ='' divyesh '' 

СУБД интерпретирует правильно СКП до

SELECT ID FROM Student WHERE Name ='' 

тогда он находит

divyesh '' 

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

Чтобы исправить эту ошибку, вы должны дважды процитировать ваши строки, переданные в качестве фильтра в ваших динамических querys в приложении:

SELECT ID FROM Student WHERE Name =' "''+str+''" ' 

Как правило, при кодировании динамического запроса ваш случай предотвращается, передавая параметр фильтра «str» некоему вспомогательному методу, который проверяет наличие отдельных одинарных кавычек и, в конечном счете, удваивает их.

Это (C# или Java) тривиальное решение относительно того, что сказал:

"SELECT ID FROM Student WHERE Name ='" + str.Replace("'", "''") + "' " 


Но я считаю, что это очень трудно, что в базе данных «имя» поле он хранится одинарные кавычки, так интересно, что вы Тринг делать ..

во всяком случае, что вы делаете, используя одинарные кавычки в полях фильтра, он также является элементом атак SQL-инъекций ..

вы следует избегать абсолютов этот тип динамического запроса и использовать в вашем коде некоторый api на основе объектной модели запроса запроса sql с параметрами и, таким образом, передать объект, который «содержит» ваш запрос, входные фильтры, создающие объекты параметров.



обновление после уточнений в ПО

String SName = null; 

if(!string.IsNullOrEmpty(txtBox1.Text))  
    SName = txtBox1.Text.trim(); 


String sql="select id from student where name = @paramName"; 

SqlConnection connection = null; 
SqlDataReader reader = null; 
try 
{ 
    connection = GetConnection(); 
    SqlCommand command = new SqlCommand(sql, connection); 

    SqlParameter param = new SqlParameter("@paramName", SqlDbType.NVarChar, 50); 
    param.Value = SName ?? SqlString.Null; 
    command .Parameters.Add(param); 

    if (_sqltransection != null) 
    { 
     command.Transaction = _sqltransection; 
    } 
    reader = command.ExecuteReader(CommandBehavior.CloseConnection); 
}    
catch (SqlException ex) 
{ 
    throw new DBException(ex); 
} 

обратите внимание, что SqlDbType.NVarChar, 50 относится к типу данных вашего поля БД «Name» (что я предполагаю, чтобы быть varchar), и поэтому он должен быть равен в tyope и length (для поля «name» должно быть хорошо 50 символов), во всяком случае, чем меньше длина входного фильтра параметра, тем лучше

+0

в моем приложении, если пользователь вводит строку, как» «+ ул +» "в текстовом поле то, что я должен делать? – Divyesh

+0

, что вы используете для кодирования? C# , ADO.NET .. отправьте более подробную информацию о вашем коде .. –

+0

Я обновил свой вопрос, пожалуйста, проверьте его. – Divyesh

2
SELECT ID FROM Student WHERE Name =' " '+'divyesh'+' " ' 

Но нет никакого смысла ...

Может быть, вы предпочитаете что-то вроде:

SELECT ID FROM Student WHERE Name like '%divyesh%' 

Если вы хотите добавить одну cuotes в строке:

SELECT '''hello''' 
+0

Но как я могу изменить ввод пользователя? – Divyesh

+0

"SELECT ID FROM Student WHERE Name = '" + txtStudentName.Text.Trim() + "'" – Lucky

+0

Я знаю, что это не имеет смысла, но в моем приложении, если пользователь вводит строку типа "+ str +", то что мне делать ? – Divyesh

1

Во-первых, ваш результирующий запрос является недопустимым, так как двойные кавычки используются для имен объектов базы данных, а не для строковых литералов: "divyesh" это имя столбца, 'divyesh' это строка. Вам нужен второй, так что измените двойные кавычки на одиночные.

Во-вторых, никогда не используйте пользовательский ввод для построения SQL-оператора, подобного этому. Если ваш пользователь выбирает имя "'; DROP DATABASE yourdb; SELECT '", ваша база данных исчезнет. Подробнее читайте на тему «SQL injection».

+0

Правда абсолютно, SQL Injection – Lucky

1

Я согласен с предыдущим ответом. В этом случае вы должны использовать Подготовленные заявления. В this странице вы можете найти примеры

+0

@Andrew_Bogdanov Добро пожаловать в Stack Overflow.Я хотел бы отметить, что «предыдущий» ответ может быть удален или выбран в качестве принятого ответа и, таким образом, взвинчен. Если вы хотите указать конкретный ответ, используйте @ notation с именем автора. Получив достаточную репутацию, вы можете оставлять комментарии с улучшениями для конкретных ответов. Кроме того, ответ с помощью одной ссылки не является хорошей практикой, поскольку ссылка может стать недействительной. Приветствия –

+0

@RuslanBes Спасибо за заметку. Что относительно символа @ это очень полезная информация для меня. Если ссылка в моем ответе была нарушена, любой читатель может использовать Google со словами «Подготовленное заявление», и он нашел всю информацию. –

Смежные вопросы