В целом, когда вы внедряете базовый веб-сервис SOAP, вы открываете сервис для всего мира, хорошего и плохого.Основное беспокойство, которое вы должны учитывать в своем коде, это проверка входных данных.Наивный прием струн, в частности, может быть очень разрушительным.Если есть ЛЮБОЕ значение, число может быть тем, что вы не можете обработать, ищите его и не продолжайте.Если вы принимаете строки, убедитесь, что вы тщательно очистили их (ищите и очень с подозрением относитесь к точкам с запятой и избегайте каждого «специального символа», который вы видите).
Обычная атака на наивный сервис, который использует неанализованные строки в запросе SQL, может выглядеть как «ABC»; drop database master; ».Если ваш код вставил это в SQL-запрос, не заметив искусственное завершение запроса и вредоносный скрипт, вы можете очистить свой рабочий стол на следующий день.Решение очень простое;экранируйте одиночную кавычку, замените точку с запятой представлением ASCII или Unicode, из которого вы можете перевести обратно (или просто удалить его), и вызов службы будет рассматривать его как мусор.
Это вызываетвторой момент;Ваши веб-службы, даже если они являются вашим кодом, должны вызывать большие подозрения в остальной части вашей системы.Веб-сервисы должны использовать аутентификацию БД, которая предоставляет минимально возможные разрешения для выполнения своей работы.Если ваша служба использует учетную запись администратора или администратора, вы почти наверняка ошибаетесь;Приведенный выше запрос, если он будет выполнен, будет фактически выполнен, и ваша основная БД исчезнет, что сделает ваш сервер БД неработоспособным.Если ваша служба использует имя входа, которое очень строго контролирует разрешения только для того, что требуется службе, SQL Server будет раздражать, но это бесконечно предпочтительнее потери основной базы данных.
Кроме того, будьте очень внимательны при обработке исключений.Неправильно сформированное исключение, которое будет возвращено через SOAP во многом подобно действительному результату, может содержать конфиденциальную информацию, побуждая злоумышленника попытаться заставить ваш сервис выдать исключение, содержащее полезную информацию о реализации, стоящей за сервисом.Исключения SQL / ADO особенно полезны для злоумышленников, поскольку они предоставляют информацию о вашей структуре данных, которая может быть использована для создания проблем.Ищите вещи, которые могли бы выбросить исключения вне вашего контроля, и корректно обрабатывать ситуацию, прежде чем CLR или другие уровни, более глубокие, чем ваш код, могут помешать этому.Перехват всех исключений, как правило, является плохой практикой в других местах, но «поймать и отпустить» с некоторой очисткой может быть хорошей идеей, и очень распространенные перенаправления 500 ошибок, которые обычно указывают на перехват исключений, являются обычной практикой в вебосфере.Если вы хотите или должны добавить исключение в свой код, тщательно его продумайте и не включайте в него информацию, которую вы не хотите, чтобы мир знал.
С архитектурной точки зрения думайте о своих услугах как о электрическихрозетка в стене.Вилки являются ЕДИНСТВЕННЫМ способом получить то, что вы хотите (мощность) от стены.Вы знаете, что есть J-коробки, кабелепровод, переключатели и т. Д., Но вы не можете получить к ним доступ без большого (буквального) взлома.Следуя этой аналогии, ваши конечные точки должны быть настроены на прослушивание указанных, известных портов, а остальная часть системы должна выглядеть как стена снаружи;все остальные порты должны быть закрыты.