Безопасен ли TableAdapter / DataSet от SQL-инъекции?

#asp.net #sql #code-injection

#asp.net #sql #внедрение кода

Вопрос:

В моем ASP.NET (3.5) проект, я использую встроенные адаптеры таблиц / Dataset для всего доступа к данным. Обеспечивает ли он ту же безопасность, что и SqlDataSource от SQL-инъекции? Я использую параметры следующим образом.

 Dim myDAL As New ABCTableAdapters.XYZTableAdapter
Label1.Text = myDAL.getDatafromDB(myParameter)
  

Обновление 1:

      Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim myParameter As String = getSafeURL(Request.QueryString("MS_Code")) 'getsafeurl encodes querystring using HttpUtility.UrlEncode
            Dim myDAL As New ABCTableAdapters.XYZTableAdapter
            Label1.Text = myDAL.getDatafromDB(myParameter)
     End Sub
  

getDatafromDB соответствует следующему запросу, присутствующему в app_code / DAL.xsd

ВЫБЕРИТЕ что-то ИЗ sometable, где fieldname = @parameter

Обновление 2: если я «просматриваю код» XSD, я могу увидеть следующее

 <SelectCommand>
              <DbCommand CommandType="Text" ModifiedByUser="true">
                <CommandText>SELECT pageContent FROM [content] where name = @name</CommandText>
                <Parameters>
                  <Parameter AllowDbNull="true" AutogeneratedName="name" ColumnName="name" DataSourceName="iseac.dbo.[content]" DataTypeServer="nchar(100)" DbType="String" Direction="Input" ParameterName="@name" Precision="0" ProviderType="NChar" Scale="0" Size="100" SourceColumn="name" SourceColumnNullMapping="false" SourceVersion="Current" />
                </Parameters>
              </DbCommand>
            </SelectCommand>
  

Комментарии:

1. Не могли бы вы показать, как getDatafromDB выглядит метод?

2. @Дарин Димитров — пожалуйста, обратитесь к обновлению

Ответ №1:

Это зависит.

Вы можете получить SQL-инъекцию, если плохо используете TableAdapters.

Главное — использовать SqlParameters для всех данных, которые собираются от пользователей.

Можете ли вы показать часть своего кода доступа к данным?

Посмотрите здесь, как: Защитить от SQL-инъекции в ASP.NET

 using System.Data;
using System.Data.SqlClient;

using (SqlConnection connection = new SqlConnection(connectionString))
{
   DataSet userDataset = new DataSet();
   SqlDataAdapter myDataAdapter = new SqlDataAdapter(
   "SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", 
     connection);                
   myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
   myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
   myDataAdapter.Fill(userDataset);
}
  

Важной частью здесь является то, что введенные пользователем данные (поступающие из веб-запроса) передаются в БД внутри параметров базы данных, таких как @au_id. В этом случае вы защищены от SQL-инъекции.

ПЛОХОЙ СПОСОБ был бы таким (НЕ ИСПОЛЬЗУЙТЕ ЭТО):

 myCommandText = string.Format(
   "SELECT au_lname, au_fname 
    FROM Authors WHERE au_id = {0}", SSN.Text)
  

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

Итак, всегда используйте параметры базы данных.

Кроме того, если вы это сделаете, вы выиграете в производительности, потому что DB будет кэшировать план выполнения, и если вы позже выполните тот же SQL только с разными значениями параметров, у DB уже есть план выполнения, и ему не нужно снова анализировать sql.

Комментарии:

1. Есть ли у вас где-нибудь поблизости что-то вроде new SqlParameter(«@parameter», SlqType.Varchar) ?

2. пожалуйста, обратитесь к обновлению 2. Разве это не то же самое, используя типизированные параметры. Меня беспокоит только то, соответствует ли это той же безопасности, что и ADO.NET параметризованные запросы, рекомендуемые для предотвращения SQLi

3. Также обратитесь к этой статье Скотта Гу, в которой он упоминает … TableAdapter / DataSet designer, встроенный в VS 2005, использует этот механизм автоматически weblogs.asp.net/scottgu/archive/2006/09/30 /…

4. Вы просматриваете документ Dataset.xsd. Вам следует лучше взглянуть на Dataset. Designer.vb code (в обозревателе решений нажмите «Показать все файлы» и посмотрите под узлом DataSet). Это то, что компилируется и выполняется.

5. Jup. Scott Gu также сообщает, что если вы используете datasets / tableadapters, вы в безопасности. Но обратите внимание, что адаптеры datasets / table не являются предпочтительным способом реализации вашего доступа к данным в наши дни. Вместо этого используйте ORM (LINQ2SQL, NHibernate, Entity Framework, …)