簡體   English   中英

重構公共API以減少安全風險

[英]Refactoring public API to reduce security risks

在我們的應用程序中,WCF層中的PublicManagerService類顯示出指數增長的跡象,這導致公共API中暴露了方法,這可能導致我們的安全風險增加,惡意攻擊的門道並降低性能。

在我們的AccountController類中,在用戶單擊電子郵件中的超鏈接時使用的Accept和Decline方法中可以看到一個示例。 對公共API中的方法進行了以下調用:

  • GetTransactionEmailLogByGUID
  • UpdateTransactionHitCount
  • SaveApprovalLog
  • GeneratePDF
  • UploadBlobByType
  • SetCurrentCulture(此方法被其他方法使用,因此可能會保留)
  • 發電子郵件

我們應該旨在只公開公開一種方法來執行Accept過程,同樣,對於Decline方法,它也使用完全相同的調用。

    /// <summary>
    ///  Response to Accept 
    /// </summary>
    /// <param name="guid"></param>
    /// <param name="comment"></param>
    /// <returns></returns>
    public ActionResult Accept(string guid,string comment)
    {
        Gateway.Instance.Logger.LogDebug("[Accept] method entered.");
        IEnumerable<TransactionEmailLog> transactionEmailLogs = _publicServiceManager.GetTransactionEmailLogByGUID(guid.Trim());
        ViewBag.GUID = guid.Trim();
        if (transactionEmailLogs != null && transactionEmailLogs.Count() > 0)
        {
            var transactionEmailLog = transactionEmailLogs.FirstOrDefault();
            if (transactionEmailLog.HitCount < 50)
            {
                _publicServiceManager.UpdateTransactonHitCount(transactionEmailLog.GUID);
                var transaction = transactionEmailLog.Transaction;

                if (transaction != null)
                {
                    ViewBag.InvoiceDate = transaction.InvoiceIssueDate != null ? Convert.ToDateTime(transaction.InvoiceIssueDate).ToShortDateString() : "";
                    ViewBag.InvoiceNumber = transaction.InvoiceNumber != null ? Convert.ToString(transaction.InvoiceNumber) : "";
                    ViewBag.DueDate = transaction.PaymentDueDate != null ? Convert.ToDateTime(transaction.PaymentDueDate).ToShortDateString() : "";
                    ViewBag.AmountDue = transaction.PaymentDueDate != null ? transaction.CurrencyCode + " " + Convert.ToDecimal(transaction.InvoiceTotalPayable, CultureInfo.CurrentCulture.NumberFormat).ToString("N") : "";
                }

                ViewBag.IsAcceptOrDecline = "True";
                TransactionApprovalLog approvalLog = new TransactionApprovalLog { IsAccepted = true, CreatedBy = transactionEmailLog.ReferredTo, CreatedDate = DateTime.UtcNow, Transaction = transaction };
                if (!string.IsNullOrWhiteSpace(comment))
                {
                    approvalLog.Comments = comment;
                }
                this._publicServiceManager.SaveApprovalLog(approvalLog);

                if (transaction != null)
                {
                    this.SendEmailNotficationOfInvoiceVerification(transaction, guid, comment, Language.Accepted, transactionEmailLog);
                }
            }
        }
        ViewBag.Message =Language.InvoiceVerificationAcceptMessage;

        Gateway.Instance.Logger.LogDebug("[Accept] method exited.");

        if (Request.IsAjaxRequest())
        {
            return Json(new { result = "success" }, JsonRequestBehavior.AllowGet);
        }
        return View("InvoiceVerification");
    }

如您所見,“ _ publicServiceManager”中有許多不同的公開方法。 我要做的是創建一個DataContract對象,該對象包含將需要的信息,例如GUID,CultureName等,我旨在將其傳遞到PublicManagerService中的新方法中。

public void VerifyInvoice (InvoiceVerificationDataContract invoiceVerificationDetails){}

我的問題是,如何最好地重構此代碼? 我應該在WCF層中有任何邏輯還是應該保留在業務層中? 非常感謝您提前提出的所有建議。

我認為重構此代碼的第一步是在某種集成測試中包裝對Accept和Decline操作的調用。

這將使您在不降低或不損害整個過程的情況下,對服務的組成有所了解。

這個過程看起來好像是在對某種業務過程進行建模,因此要將其納入一組合並的公共運營中,我想您需要進行以下工作:

  • 每個步驟是否都需要成功執行才能使整個操作成功?
  • 每個步驟都必須按照特定順序執行嗎?
  • 您將如何在一個或多個步驟中處理故障/恢復?
  • 合並單獨的功能甚至有意義嗎?
  • 是否需要同步調用整個業務流程?

您可能已經考慮了所有這些要點,並且還做了很多其他工作,因此此答案可能沒有太大價值,但是很難以當前形式來回答您的問題。 您可以將命令處理器模式看作是解耦流程中各個步驟的一種方式。

贊賞這不能直接回答您的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM