2013-03-28 4 views
0

Мне пришлось динамически создавать инструкции Sql для параметров хранимой процедуры из-за уровня доступа устаревшего доступа к базе данных.Предотвращение инъекции Sql при составлении динамического Sql

var p1 = Encoding.ASCII.GetString(p1).Replace("'", "''").Replace("\n", " "); 
var p2 = Encoding.ASCII.GetString(p2).Replace("'", "''").Replace("\n", " "); 
..... 
var sql = string.Format("exec storedprocedure @p1='{0}', @p2='{1}', @p3='{2}', ....", 
    p1, p2, p3, ...); 

Прямо сейчас я заменить ' на '' и \n' в пустом пространстве после преобразования строки в строку ASCII. Что еще мне нужно сделать? Я не могу использовать SqlParamter и должен был выполнить последовательность из-за некоторых фактов.

+0

Как насчет '\ '', ",' \ "', unicode, который при правильном декодировании превращается в одно из указанных выше (http://security.stackexchange.com/questions/11391/how-did- anonymous-use-utf-16-ascii-to-fool-php-escaping) и т. д.? – Patashu

+4

Почему вы не можете использовать SqlParameter? – Moho

+0

@Patashu Я обновил вопрос и принудительно передал строку Ascii – ca9163d9

ответ

2

Dont.

Используйте typed parameters для всех ваших запросов, имеющих динамические входы. Все вкусы ADO набрали параметры, а также поставщики ADO.NET для каждой базы данных под солнцем. Если вы попытаетесь запустить собственную профилактику инъекций SQL, у вас будет плохое время.

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