#asp.net #web-services #c#-4.0 #denial-of-service
#asp.net #веб-сервисы #c #-4.0 #отказ в обслуживании
Вопрос:
У меня есть следующий веб-метод (ASP.NET , c # 4.0):
[WebMethod]
public XmlDocument NewQuote(string username, string password, XmlDocument xml)
{
// process request
}
Мне было интересно, как предотвратить атаку XML DoS (billion laughs, external entity и т.д.), Поскольку XmlDocument принимается в качестве параметра? Где и как я могу запретить обработку DTD? Очевидно, что в теле веб-метода уже слишком поздно.
Спасибо!
Комментарии:
1. На самом деле это очень хороший вопрос. Я считаю, что правильный ответ — «не принимать XML от неавторизованных пользователей», но я сомневаюсь, что это то, что вы ищете 🙂
Ответ №1:
Укажите логику, согласно которой пользователь может загружать только x файлов или вызывать эту службу x раз.
Комментарии:
1. Не подойдет. Вполне возможно уничтожить даже самый быстрый сервер одним файлом XML длиной 10-15 строк
2. @Stilgar Предполагая, что вы имеете в виду «правильно защищенный сервер», у вас есть пример, подтверждающий это утверждение?
3. Как насчет того, чтобы просто вызвать метод со строкой вместо XmlDocument . Затем, если он действителен (правильное имя пользователя / пароль, все еще ниже порогового значения), попробуйте преобразовать его в XmlDocument?
4. А затем вы можете проверить его с помощью XSD
5. Да, я знаю. Сохраните всю свою работу (серьезно!). Откройте Visual Studio и создайте новый XML-документ (VS использует метод загрузки .NET для создания объекта XmlDocument для работы редактора) и вставьте XML-файл в конце этой статьи sietch.net/ViewNewsItem.aspx?NewsItemID=173 (Я связываю только потому, что не могу вставить форматированный XML в комментарий). Причина проблемы заключается в том, что . NET framework по умолчанию пытается расширить ссылки на сущности (вероятно, для предоставления расширенных возможностей). Вероятно, вам потребуется перезагрузить компьютер. Вы можете воспроизвести это в простом консольном приложении, которое загружает XML