2015-04-21 3 views
1

Для ведения транзакций с транзакциями мне нужно указать, предоставляют ли пользователи необходимые поля/информацию или нет. Если да, я заменю реальную информацию на *. Если нет, я сделаю этот запрос неудачным, возвращая значение «false».Как дезинфицировать/скрывать конфиденциальные данные в C#

Ниже приведены класс и метод определения данных.

public class CreditCard 
{ 
public string brand { get; set; } 
public string billingphone { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    CreditCard creditcard =new CreditCard(){brand="VISA", billingphone="777-111-2222"}; 
    bool IsVerified= SanitizePaymnetData(creditcard);   
    } 

    private bool SanitizePaymnetData(ref CreditCard creditcard) 
    { 
     bool isDataSanitized = true; 

     if(!String.IsNullOrEmpty(creditcard.brand)) 
     { 
      creditcard.brand ="*";    
     } 
     else 
     { 
      isDataSanitized = false; 
     } 

     if (!String.IsNullOrEmpty(creditcard.billingphone)) 
     { 
      creditcard.billing_phone = "*"; 
     } 
     else 
     { 
      isDataSanitized = false; 
     } 

     return isDataSanitized; 
    } 
} 

Метод «SanitizePaymentData» выглядит как уродливый. Есть ли способ сделать его более чистым/аккуратным?

+0

Ваш вопрос несколько стилистичен и основан на мнениях. Я думаю, что ваш подход в порядке. Есть ли какое-либо требование, чтобы иметь возможность выявлять скрытые данные? Если это так, вы можете рассмотреть возможность шифрования вывода. Если это не выглядит хорошо для меня – ne1410s

+0

Почему бы просто не написать «true», если они проверены и «ложные», если они не являются? Должен ли журнал включать другие нечувствительные данные? – Jedediah

+0

Привет @Jedediah, да, мне нужно регистрировать другие нечувствительные данные в каждом запросе, независимо от того, этот запрос является хорошим или плохим. – user3174976

ответ

4

Основная проблема, которую я вижу здесь, потенциально является ремонтопригодностью. По мере добавления полей в CreditCard вам нужно будет добавить дополнительные проверки в SantitzePaymentData(). Если другие разработчики позже будут работать над этим, они могут не знать об этом требовании, или вы можете забыть о нем позже, а конфиденциальная информация начнет появляться в вашем журнале. Так как это не приведет к ошибке исключения или компиляции, возможно, потребуется некоторое время, прежде чем вы заметите, что это произошло.

Я не знаю, действительно ли это настоящий проект или что-то, что вы используете для изучения, но возникает другая проблема, когда вы решите добавить другой способ оплаты, например, банковский перевод. Затем вам придется создать еще одну функцию SanitizePaymentData(), которая работает в новом классе платежей, но у нее будет по существу дублированный код из вашего исходного метода. Это дублирует работу, нарушает принцип DRY и создает беспорядок в вашем проекте.

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

public class CreditCard 
{ 
    [SanitizeInLog] 
    public string Brand {get; set;} 

    [SanitizeInLog] 
    public string BillingPhone {get; set;} 
} 

Теперь, ваш метод регистрации/класс может просто проверить, существуют ли эти атрибуты на поле, и включите их для «*» или что-то еще.

+3

Полезное решение, если объем данных, подлежащих дезинфекции, ограничен. Вы можете добавить значение замены для использования в журнале как необязательный параметр атрибута со значением по умолчанию «*», если ни один не указан. – Alex

+0

@Alex yes, good call – Jedediah

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