2016-08-01 4 views
0

В интересах экономии времени я написал модуль SQL, который позволяет мне писать вещи в сокращенном виде, а не инициализировать объект SqlCommand каждый раз, когда я хочу запускать запросы внутри модуля.Использование службы WCF для обработки SQL-запросов

Теперь я пытаюсь перенести этот модуль на службу WCF по соображениям безопасности (предотвращая доступ приложения Winforms к непосредственному доступу к базе данных).

Следующая функция используется для запросов к базе данных и возвращает DataTable результатов

public DataTable FillTable(string sql) 
{ 
    query = new SqlCommand(); 

    query.Connection = conn; 
    query.CommandText = sql; 

    DataTable dt = new DataTable(); 

    try 
    { 
     conn.Open(); 
     dt.Load(query.ExecuteReader()); 
     conn.Close(); 
    } 
    catch (Exception ex) 
    { 
     conn.Close(); 
     Console.Write("fillTable: " + ex.Message); 
    } 

    return dt; 
} 

Учитывая, что это буквально только принимает строку в качестве входных данных, можно предположить, что это является открытым для потенциальных атак инъекций - несмотря на он не запускается непосредственно в базе данных? Если потенциальный злоумышленник знает только местоположение службы (на основе ссылки на службу в приложении), можно ли легко заменить отправленную строку и извлечь несанкционированные данные?

База данных, с которой я работаю, является небольшой, но я хочу убедиться, что я правильно защищаю.

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

+1

Нечего сказать. Да, ваш код очень уязвим для любого типа инъекций – Steve

+1

, вы можете использовать это как частный метод и использовать его. вам не нужно раскрывать это как общедоступную веб-службу. в любом случае каждый метод api должен иметь проверку подлинности/авторизации. тот, кто хочет использовать этот метод обслуживания, должен это сделать. – Aravind

+0

Любая конкретная причина, по которой вы по-прежнему используете простой SQL вместо переключения на сущность Framework и linq, которые по дизайну не могут быть затронуты SQL-инъекцией? –

ответ

1

Сервер должен быть единственным, кто использовал этот метод FillTable. Он должен быть недоступен для клиента.

Клиент должен использовать только kjow, например, getBooks(), и сервер вызывает FillTable («select * from books»).

+0

То, что я надеялся, я мог бы избежать, но в глубине души я думаю, что я уже знал, что это единственный реальный метод – Takarii

2

Да, код можно легко вводить. Более безопасный способ использования некоторых ORM для этой цели. Для примера Entity Framework или Hibernate, они помогут вам справиться с проблемами, как SQL Injection и т.д.

ИЛИ

По словам @Fil вы можете скрыть реализацию от пользователя, окружив его в каком-либо внешнем методе, который вы можете предоставить пользователям.