#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, …)