65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 最佳实践和禁忌

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (22投票s)

2016年7月22日

CPOL

4分钟阅读

viewsIcon

19958

本文着重介绍 ASP.NET 的通用最佳实践和禁忌。

引言

有些人可能会不断陷入陷阱而浑然不知。本文着重介绍 ASP.NET 的通用最佳实践和禁忌。列出的绝大多数项都取自 ASP.NET 团队的建议。虽然这可能不是一个完整的清单,但它涵盖了一些人们经常遇到的最常见的“陷阱”。

如果您知道其他关于 ASP.NET 通用最佳实践和禁忌的技巧,请随时留言,以便我更新列表。 :)

控件适配器

如果您仍在使用控件适配器,特别是 WebForms 用户,请尽可能避免使用。

  • 避免:控件适配器,因为它们最初是为了支持移动控件为不同设备呈现不同标记而创建的。

  • 推荐:CSS 媒体查询、响应式设计和移动设备专用视图。

控件上的样式属性

  • 尽量避免:四千个特定的控件样式属性,例如 EditItemTemplate-AlternateItem-Font-ForeColor-SomeStyle-Blah-Blah :S
  • 使用内联 CSS 样式,例如 style=“color:yellow;text-align:center;”
  • 推荐:CSS 样式表。您可以自己编写,也可以使用 Bootstrap,或者结合自己的 CSS。

JavaScript 框架和 AjaxControlToolkit

  • 尽量避免:将您的 jQuery 代码或其他 JS 框架代码与 WebForm 的 AjaxControlToolkit 控件混合使用,以避免功能问题。
  • 推荐:坚持使用特定的控件库。

UpdatePanel 控件

  • 不要:过度使用它(考虑性能和可维护性)
  • 建议:在必要时使用,并且如果使用它是有意义的。
  • 尽量避免:它无助于您成为一名更好的 Web 开发者。
  • 推荐:AJAX,例如 jQuery AJAX 可用于执行异步更新。

页面和控件回调

  • 尽量避免:页面回调或控件回调。
  • 推荐:其他任何方式,例如 Page Method、Web Service、AJAX、Web API。

脚本和 CSS 文件

  • 建议:在生产环境中部署时,对 CSS 和脚本文件进行最小化处理和捆绑。
  • 尽量避免:部署未最小化的脚本和 CSS(当您可以对其进行最小化处理时)。

静态脚本引用

  • 尽量避免:引用本地脚本(例如 jQuery)。
  • 推荐:在引用静态文件时,使用 CDN(内容分发网络)。
  • 但务必:添加一个回退的本地引用,以防 CDN 失败。

能力检测

  • 尽量避免:BrowserCaps,因为它在新的浏览器版本发布时很容易失效。
  • 推荐:客户端功能检测和亮显,例如通过 Modernizr。

SQL 查询

  • 切勿:将输入值直接追加到 SQL 语句中,这会导致 SQL 注入攻击。这是绝对禁止的!
  • Do:

     (1) Use parameter queries
     (2) Stored Procedures
     (3) ORM e.g. Entity Framework, NHibernate etc.

本文介绍了 SQL 注入的防范方法。保护您的数据:防止 SQL 注入

数据显示

  • 切勿:在页面中显示大量数据,这会影响应用程序的性能,并且不便于用户使用。
  • 建议:限制要显示的数据量。

    (1) Filter out items and load the associated data.
    (2) Apply paging (e.g using custom paging with LINQ or using SQL paging).
    (3) Apply data caching (but be careful: use it only where it makes sense).
    

请求验证

  • 切勿:依赖请求验证来保护您的站点免受 XSS 攻击。
  • Do:

    (1) Validate well-formedness of the data 
             “Is this user-submitted value, a valid System.Uri whose scheme is http: or https:?”
    (2) Encode data on the way out.
             CSHTML: @foo ? ASPX: <%: foo %>
    (3) Don’t forget about JavaScriptStringEncode, UrlEncode, etc.
    

无 Cookie 的表单身份验证和会话

  • 切勿:启用无 Cookie 的表单身份验证或会话,因为这可能使您的用户遭受恶意攻击。
  • Do:

     (1) Enable “require cookies” for these features.
     (2) Consider using only secure (SSL) cookies for the sites serving sensitive information.

EnableViewStateMac

对于使用 ASP.NET 运行时 < 4.5.2 的开发人员

  • 切勿:将 EnableViewStateMac 设置为 false。
  • 切勿:即使是单个页面也不行。

     “But I’m not using ViewState!” is not a valid excuse.
  • 建议:嘲笑微软一开始就允许此选项。 :D

     Well MS already forbids it when they released ASP.NET 4.5.2.

中等信任

  • 切勿:依赖中等信任(或任何其他 级别)作为安全边界。
  • Do:

    (1) Place untrusted Applications into their own Application pools.
    (2) Run each Application pool under its own unique identity.
    (3) You can follow some guidance here: https://support.microsoft.com/en-us/kb/2698981.

appSettings

  • 切勿:在生产环境中长时间使用 <appSettings> 来禁用 Microsoft 安全修复程序。
  • 建议:使用 Microsoft 安全敏感的 <appSettings> 配置作为临时兼容性,在推出服务器升级或补丁时提供支持。

请参阅此处的列表

UrlPathEncode

  • 切勿:使用 UrlPathEncode 来编码任意用户提供的字符串。
  • Do:

    (1) Sanitize inputs instead, checking submitted URL for well-formation.
    (2) Use UrlEncode to encode the user input meant to appear as a query string parameter in the URL.

PreSendRequestHeaders & PreSendRequestContent

  • 尽量避免:从托管的 IHttpModule 实例中注册这些事件。
  • 推荐:如果您需要挂钩这些异步管道事件,请使用本机 IIS 模块。

异步页面事件

  • 尽量避免:为页面生命周期事件编写异步 void 方法(例如 Page_Load)。
  • 推荐:如果您需要注册异步工作,请改用 Page.RegisterAsyncTask()
  • 建议:如果使用 Task,请设置 <httpruntimetargetframework=“4.5”>。

Response.Redirect & End

请注意Reponse.Redirect(String) 会调用 Response.End(),这会在同步请求中中止当前线程并停止代码执行。

对于异步处理程序,Response.End() 不会中止当前线程,因此代码执行会继续。

如果您需要重定向响应,请使用适合您所使用的框架的方法。例如,在 MVC 中,返回一个 RedirectResult 而不是调用 Response.Redirect

EnableViewState & ViewStateMode

  • 尽量避免:使用 EnableViewState
  • 推荐:

    (1) Set ViewStateMode=“Disabled” at page directive level.
    (2) Set ViewStateMode=“Enabled” only on the controls that require state.

SQLMembershipProvider

请注意:已被 UniversalProviders 和 ASP.NET Identity 取代,后者可与所有数据库和 Entity Framework 支持配合使用,包括 SQL、Azure SQL、SQL Compact、MySQL 等。

长时间运行的请求

  • 尽量避免:会话,因为 ASP.NET 可能会在可能不方便的时间强制释放会话对象锁,阻塞 I/O 操作。
  • 推荐:如果可能,使用 WebSockets,其每个请求的内存开销要低得多。

实时更新

  • 尽量避免:通过 AJAX 定期轮询服务器进行更新的传统方法。
  • 推荐:ASP.NET SignalR。它提供了一个简单清晰的 API,允许您创建实时 Web 应用程序。HTML5 也值得尝试。

WebForms

  • 切勿:坚持使用 Web Forms。
  • Do

    (1) Learn other technologies that ASP.NET offers such as MVC, Web API, SignalR and ASP.NET Mobile. 
        Also check out the new ASP.NET Core.
    (2) Learn JavaScript frameworks (e.g Angular, Knockout, React etc..).
    (3) Keep up to date with what’s the latest and know the new features it offers.

参考

© . All rights reserved.