[英]Refactoring public API to reduce security risks
在我們的應用程序中,WCF層中的PublicManagerService類顯示出指數增長的跡象,這導致公共API中暴露了方法,這可能導致我們的安全風險增加,惡意攻擊的門道並降低性能。
在我們的AccountController類中,在用戶單擊電子郵件中的超鏈接時使用的Accept和Decline方法中可以看到一個示例。 對公共API中的方法進行了以下調用:
我們應該旨在只公開公開一種方法來執行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.