2017-02-09 7 views
0

У меня есть служба WCF, на которой выставлены конечные точки basicHttp. В PEN-тестировании сообщается о том, что служба принимает строки, содержащие теги скриптов, и возвращает строки с тегом скрипта, которые при непосредственном использовании в потребляющих его веб-приложениях вызывают атаку XSS.Предотвращение атак XSS в вызовах WCF

Что я могу сделать, так это в каждой реализации операции написать код, чтобы сделать скрипт строкой. Но есть ли простой/эффективный способ, чтобы я мог написать один код для очистки всех входящих строк в вызовах WCF из тегов скриптов.

например. в операции AddUser, которая принимает имя пользователя и адрес, если я отправлю Akshay<script>alert('hi');</script>, операция просто должна удалить теги сценария.

Так в настоящее время она возвращается Akshay<script>alert('hi');</script>, но, как ожидается, вернуть что-то вроде Akshayalert('hi');

ответ

1

Вы можете реализовать свою собственную операцию Invoker:

public class CleanOperationInvoker:IOperationInvoker 
{ 
    private readonly IOperationInvoker _invoker; 
    public CacheOperationInvoker(IOperationInvoker invoker) 
    { 
     _invoker = invoker; 
    } 

    public object Invoke(object instance, object[] inputs, out object[] outputs) 
    { 
     inputs = CleanInputs(inputs); 
     return _invoker.Invoke(instance, inputs, out outputs); 
    } 

    private static object[] CleanInputs(object[] inputs) 
    { 
     for(int i = 0; i < inputs.Length;i++) 
     { 
      var str = inputs[i] as string; 
      if(!string.IsNullOrEmpty(str)) 
       inputs[i] = StripHTML(str); 
     } 
     return inputs; 
    } 

    public static string StripHTML(string input) 
    { 
     return Regex.Replace(input, "<.*?>", String.Empty); 
    } 
} 

Затем реализуют поведение:

public class CleanOperationBehavior: Attribute, IOperationBehavior 
{ 
    public void ApplyDispatchBehavior(OperationDescription operationDescription, System.ServiceModel.Dispatcher.DispatchOperation dispatchOperation) 
    { 
     //Putting ourself in between dispatching invoker 
     dispatchOperation.Invoker = new CleanOperationInvoker(dispatchOperation.Invoker); 
    } 
} 

Тогда просто используйте его следующим образом:

[ServiceContract] 
public interface IHackMeService 
{ 
    [OperationContract] 
    [CleanOperationBehavior] 
    int Get(string hack, string me, int beach); 
} 

Или вы можете реализовать поведение конечных точек и прикрепить его ко всем вашим операциям по всем контрактам. Таким образом, кстати, вы можете даже отклонить операцию, если она содержит недопустимые строки. Просто бросьте исключение или что-то еще.

Я не скомпилировал его, поэтому, если вы встретите какие-либо ошибки, вы можете сказать мне, и я обновлю свой ответ.

+0

Hi eocron, я реализовал свой ответ, но я получил две ошибки в «CleanOperationInvoker» класс, ошибках ниже. 1) CacheOperationInvoker: метод должен иметь тип возврата 2) поле readonly не может быть присвоено Не могли бы вы заглянуть в него и обновить свой ответ, мне нужно срочно. Спасибо! –

+0

Привет, eocron, можете ли вы предоставить мне код для реализации поведения конечных точек и привязать его ко всем вашим операциям по всем контрактам? –

0

Существует так называемый message interceptor для wcf, в котором вы можете перехватывать каждый входящий и исходящий запрос до фактической целевой операции. Это идеальная реализация, если вы хотите проверять сообщения без аннотации каждой операции. Это довольно легко реализовать и подключиться к вашему сервису.

Этот вывод PENtest ​​- это не только повторная работа вашего сервиса, но и приложение, которое будет потреблять результат.

Примечание: Иногда PenTest результат может быть ложным положительным, если оба специальным образом приложения может обрабатывать ввод без вреда :)

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