Должен ли я беспокоиться об атаках вставки / обновления / удаления / внедрения, когда я использую следующий SqlDataAdapter? - PullRequest
3 голосов
/ 16 ноября 2011

Нужно ли что-либо делать для предотвращения атак вставки / обновления / удаления / внедрения, когда я использую следующий код?

public static DataSet getReportDataSet(string sqlSelectStatement)
{
    SqlDataAdapter da = new SqlDataAdapter(sqlSelectStatement, new SqlConnection(GlobalVars.ConnectionString));
    DataSet reportData = new DataSet();
    da.Fill(reportData, "reportData");
    return reportData;
}

Идея заключается в том, что я буду извлекатьSQL из серии Crystal Reports, извлекая данные для каждого отчета из MS SQL Server, привязывая данные к отчетам и затем экспортируя заполненные отчеты в PDF.

Я знаю, что вы можете использовать встроенныйв функциональности, чтобы заставить отчеты извлекать свои собственные данные, но мои тесты показали, что отправка данных в отчеты намного быстрее.Моя единственная проблема в том, что я не могу контролировать отчеты, которые будут публиковаться.

Людям будет необходимо предоставить свои учетные данные для входа на SQL Server, поэтому они смогут просматривать данные только из тех баз данных, к которым у них есть разрешения ... но некоторые пользователи имеют права на запись,и я беспокоюсь, что слепой запуск строки sql, извлеченной из Crystal Report, потенциально может допустить атаку вставкой / обновлением / удалением / инъекцией ...

Я думаю, что могу беспокоиться ни о чем, ноне могу найти ничего, что прямо заявляет, если это можно использовать для чего-то, кроме выбора.

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

Итак, из первоначальных комментариев я думаю, чтонужно беспокоиться о выражениях SQL помимо SELECT.Так что мой вопрос теперь становится;Есть ли какой-то способ указать, что SqlConnection может использоваться только для «чтения» (то есть выбора).

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Проблема не в адаптере. Проблема в том, как вы передаете параметры в команду sql. Вы должны не делать такие вещи, как

string sql = "SELECT * FROM t WHERE name='" + name +"'";

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

SqlCommand cmd = new SqlCommand(SELECT * FROM t WHERE name = @name", conn);
SqlParameter param  = new SqlParameter();
param.ParameterName = "@name";
param.Value = "John Doe";
cmd.Parameters.Add(param);
1 голос
/ 16 ноября 2011

В общем, я бы сказал: да, вы должны.

Но, возможно, Crystal Reports уже цитирует строку SQL. Попробуйте "атаку" самостоятельно и посмотрите, что содержит sqlSelectStatement.

...