Как избежать внедрения кода в веб-URL - PullRequest
0 голосов
/ 10 января 2012

Я хочу знать, есть ли способ избежать внедрения SQL или XSS при чтении URL. Например: https://abc? ID = какой-то уникальный гид

Как избежать введения SQL и т. Д. При вводе вместо действительного идентификатора GUID.

Ответы [ 5 ]

4 голосов
/ 10 января 2012

Есть несколько вещей, которые вы можете сделать.

  1. Начните с использования параметризованных запросов или хорошего ORM .
  2. Просмотрите библиотеку C # AntiXSS .
  3. Очистить ваш ввод.

Читать на предотвращение SQL-инъекций

Дальнейшее чтение

SQL-инъекция больше, чем та часть, о которой вы спрашиваете. Вы хотите знать обо всех данных, входящих и исходящих из вашей базы данных. Реализуйте предложения выше, и вы «должны» быть довольно прикрыты.

Когда речь идет о предмете исходного вопроса (?id=[guid]), вы должны убедиться, что при отправке запроса вы используете тип данных System.Guid. Если string является НЕ действительным GUID, то вы знаете, что есть проблема, и вы не должны завершать запрос (IE: даже не отправляйте запрос в свой репозиторий позже, и определенно не отправляйте его до базы данных).

1 голос
/ 10 января 2012

Simple. Всегда дезинфицировать вход.Никогда неявно доверяйте или выполняйте что-либо, полученное из внешнего источника (пользователь, клиентский компьютер и т.То есть, в случае использования его в запросе SQL, никогда не просто объединяйте строковое представление GUID в запросе.Используйте параметры запроса и передайте ему фактический System.Guid объект, который был создан из полученной строки.

Если не удается создать фактический System.Guid при разборе строки, этоиндикация неверного ввода.На этом этапе вам даже не нужно пытаться создать запрос SQL или каким-либо образом использовать слой доступа к данным, просто вернуть пользователю ошибку.

0 голосов
/ 10 января 2012

Только не передавайте значение в параметре строки запроса идентификатора непосредственно в базу данных.

Вы используете C #, поэтому вы можете использовать параметры запроса или что-то вроде структуры сущностей, которая будет гарантировать, что данныеправильно отформатирован для SQL Server (хотя он может не проверять, является ли он действительным идентификатором GUID - если только это не обусловлено вашим базовым полем или типом запроса)

Для получения дополнительной информации о атаках с использованием SQL-инъекций, вот статья, которую я написал несколько лет назад: http://colinmackay.co.uk/blog/2005/04/23/sql-injection-attacks-and-some-tips-on-how-to-prevent-them/

0 голосов
/ 10 января 2012

Первое, что вы должны сделать, это сделать внедрение SQL невозможным. Насколько я понимаю, такой подход не приведет к SQL-инъекции. Это называется «параметризованными входами».

 string commandText = "UPDATE Sales.Store SET Demographics = @demographics "
    + "WHERE CustomerID = @ID;";
 SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@ID", SqlDbType.Int);
    command.Parameters["@ID"].Value = customerID;

    // Use AddWithValue to assign Demographics.
    // SQL Server will implicitly convert strings into XML.
    command.Parameters.AddWithValue("@demographics", demoXml);

Второй подход - сделать так, чтобы GUID не передавался через URL. Это делает его чрезвычайно простым для изменения, поэтому вы можете передать это значение через POST вместо GET. Это не защитит от внедрения SQL-кода, но сделает его немного более сложным и поможет обеспечить целостность данных.

Дополнительная информация: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.parameters.aspx

0 голосов
/ 10 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...