Các tính năng ẩn của ASP.NET [đã đóng]


292

Câu hỏi này tồn tại bởi vì nó có ý nghĩa lịch sử, nhưng nó không được coi là một câu hỏi hay, theo chủ đề cho trang web này, vì vậy vui lòng không sử dụng nó làm bằng chứng cho thấy bạn có thể đặt câu hỏi tương tự ở đây.

Thông tin thêm: https://stackoverflow.com/faq


Luôn có các tính năng sẽ hữu ích trong các tình huống bên lề, nhưng vì lý do đó, hầu hết mọi người không biết chúng. Tôi đang yêu cầu các tính năng thường không được dạy bởi sách giáo khoa.

Những cái mà bạn biết là gì?


Câu hỏi hay, tôi muốn có thể bỏ phiếu nhiều lần!
Gavin Miller

1
Đã đồng ý. Tôi yêu chủ đề như thế này. Có rất nhiều chiều sâu cho khuôn khổ, đôi khi bạn ngạc nhiên về những điều bạn chưa từng biết ở đó.
Deane

Tôi đang học được rất nhiều thủ thuật mới thú vị từ các phản hồi trong chủ đề này - cảm ơn! :)
Maxim Zaslavsky

16
Thay vì "Các tính năng ẩn của .." những thứ này không nên được đặt tên là "Các tính năng ít được biết đến của .." bởi vì hầu hết mọi câu trả lời đều được ghi lại trong MSDN hoặc ở nơi khác, chỉ không được biết đến hoặc sử dụng.
John K

Xem meta.stackexchange.com/questions/56669/ Mạnh , meta.stackexchange.com/questions/57226/ và các bài viết Meta liên quan để thảo luận về sự phù hợp và kết thúc.

Câu trả lời:


335

Trong khi kiểm tra, bạn có thể gửi email đến một thư mục trên máy tính của mình thay vì máy chủ SMTP. Đặt cái này trong web.config của bạn:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>

6
Có thật không? Tôi chuẩn bị cài đặt một Máy chủ SMTP giả, như Dumbster. Tôi giấu đá quý.
Eduardo Molteni

2
Có ai biết nếu bạn có thể chỉ định chia sẻ UNC cho vị trí thư mục không?
Mark Sherretta

32
Tốt hơn hết, hãy đặt cái này vào hộp dev.config của bạn, để bạn không phải thay đổi web.config trên mỗi ứng dụng bạn tạo.
Max Toro

Bạn có thể thiết lập nó để nó chỉ làm điều này trên máy chủ cục bộ? Bằng cách đó, bạn không phải thay đổi nó mỗi lần?
chobo2

Không có thiết lập cho điều đó. Bạn sẽ phải quản lý sự khác biệt về cấu hình bằng các phương pháp khác (Dự án triển khai web, xây dựng nhiệm vụ, v.v.)
John Sheehan

210

Nếu bạn đặt một tệp có tên app_offline.htm trong thư mục gốc của thư mục ứng dụng web, ASP.NET 2.0+ sẽ tắt ứng dụng và dừng xử lý bình thường mọi yêu cầu mới đến cho ứng dụng đó, chỉ hiển thị nội dung của app_offline.htm tập tin cho tất cả các yêu cầu mới .

Đây là cách nhanh nhất và dễ nhất để hiển thị thông báo "Trang web tạm thời không khả dụng" của bạn trong khi triển khai lại (hoặc khôi phục lại) các thay đổi cho máy chủ Sản xuất.

Ngoài ra, như được chỉ ra bởi marxidad , hãy đảm bảo bạn có ít nhất 512 byte nội dung trong tệp để IE6 sẽ hiển thị chính xác.


10
Đừng quên cách giải quyết cho các tin nhắn "thân thiện" của IE: tinyurl.com/app-offline-friendly
Mark Cidade

1
Ôi! Hãy cẩn thận khi sử dụng điều này với MOSS 2007. Nó sẽ chỉ hoạt động đối với các trang đã được truy cập kể từ lần khởi động lại IIS cuối cùng. Vì vậy, nếu bạn thêm trang này vào root ảo wss của mình, sau đó thử mở một trang chưa được truy cập trước đó, bạn sẽ nhận được 404.
Marc

1
@Marc - Nhận được mẹo này từ Scott Guthrie, nếu bạn cảm thấy hào phóng, bạn sẽ giúp rất nhiều nhà phát triển SharePoint tránh tình huống này nếu bạn nhận xét về bài viết của Gu: weblogs.asp.net/scottgu/archive/2005/10/ 06/426755.aspx
Troy

Thêm vào đó, điều này cũng sẽ kích hoạt tái chế Miền ứng dụng và đóng mọi kết nối cơ sở dữ liệu mở, sau khi tất cả các yêu cầu đã kết thúc.
Bart Verkoeijen

Có một sự cảnh báo cho vấn đề này: IIS trả về nội dung app_offline.htm với Mã trạng thái HTTP là 404. Nếu công cụ tìm kiếm đi lang thang và cố gắng lập chỉ mục trang web của bạn khi bạn ở chế độ ngoại tuyến này, bạn có thể không đánh giá cao kết quả. Nhưng nó hoạt động rất tốt cho ứng dụng web công ty tư nhân của tôi!
Larry Silverman

119
throw new HttpException(404, "Article not found");

Điều này sẽ được bắt bởi ASP.NET sẽ trả về trang customErrors. Đã tìm hiểu về điều này trong một Mẹo .NET gần đây của Bài đăng trong ngày


Một số nhà phát triển có thể lập luận rằng tốt hơn hết là nên kết thúc mọi thứ theo cách thủ công trong HttpContext.Response thay vì đưa ra một ngoại lệ hoạt động khá tốn kém trong sách .NET.
Lubos hasko

Đây không phải là hình thức xấu? Bạn đang hiển thị lỗi 404, trong khi bạn muốn hiển thị lỗi / ngoại lệ.
Donnie Thomas

1
Một trường hợp tôi có thể nghĩ đến là nếu ai đó đang gây rối với các tham số độc hại và đặt một cái gì đó không hợp lệ vào, bạn có thể muốn một 404 chung không phải là một lỗi cụ thể.
John Sheehan

3
Được nâng cấp hoàn toàn bởi vì bây giờ tôi biết về trang web .NET Tip of the Day.
Kon

nó chỉ hoạt động khi bạn ném nó vào httpModule hoặc httpHandler
Khaled Musaied

75

Đây là cái tốt nhất. Thêm phần này vào web.config để biên dịch nhanh hơn NHIỀU. Đây là bài 3.5SP1 qua QFE này .

<compilation optimizeCompilations="true">

Tóm tắt nhanh: chúng tôi đang giới thiệu một khóa chuyển đổi tối ưu hóa mới trong ASP.NET có thể cải thiện đáng kể tốc độ biên dịch trong một số tình huống. Có một số lưu ý, vì vậy hãy đọc để biết thêm chi tiết. Công tắc này hiện có sẵn dưới dạng QFE cho 3.5SP1 và sẽ là một phần của VS 2010.

Hệ thống biên dịch ASP.NET sử dụng một cách tiếp cận rất bảo thủ, khiến nó xóa sạch mọi công việc trước đây mà nó đã thực hiện bất cứ khi nào thay đổi tệp 'cấp cao nhất'. Các tệp 'Cấp cao nhất' bao gồm mọi thứ trong bin và App_Code, cũng như global.asax. Mặc dù điều này hoạt động tốt cho các ứng dụng nhỏ, nhưng nó trở nên gần như không thể sử dụng cho các ứng dụng rất lớn. Ví dụ, một khách hàng đang gặp phải trường hợp mất 10 phút để làm mới trang sau khi thực hiện bất kỳ thay đổi nào đối với cụm 'bin'.

Để giảm bớt nỗi đau, chúng tôi đã thêm một chế độ biên dịch 'tối ưu hóa', sử dụng phương pháp biên dịch ít bảo thủ hơn nhiều.

Qua đây :


6
Đây có phải là "mặc định" với VS 2010 hay tôi vẫn nên dùng thử?
M4N

73
  • HttpContext.C hiện tại sẽ luôn cung cấp cho bạn quyền truy cập vào Yêu cầu / Phản hồi / v.v. của bối cảnh hiện tại, ngay cả khi bạn không có quyền truy cập vào các thuộc tính của Trang (ví dụ: từ lớp trình trợ giúp được kết nối lỏng lẻo).

  • Bạn có thể tiếp tục thực thi mã trên cùng một trang sau khi chuyển hướng người dùng sang một trang khác bằng cách gọi Feedback.Redirect ( url , false )

  • Bạn không cần các tệp .ASPX nếu tất cả những gì bạn muốn là một Trang được biên dịch (hoặc bất kỳ IHttpHandler nào ). Chỉ cần đặt đường dẫn và phương thức HTTP để trỏ đến lớp trong <httpHandlers>phần tử trong tệp web.config.

  • Một đối tượng Trang có thể được truy xuất từ tệp .ASPX bằng lập trình bằng cách gọi PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, Context)


Về Phản hồi.Redirect (url, false) - Đó là rất nhiều những gì tôi đã hy vọng trong một thời gian dài .. Tôi không biết làm thế nào tôi đã bỏ lỡ điều đó nhưng thanxxx
Subliminal Hash

1
Ai đó có thể giải thích những gì bạn sẽ làm với điều này? Tôi biết nó có một số giá trị, nhưng tôi không thể hiểu tại sao ...
Deane

5
Nếu bạn muốn chuyển hướng người dùng đến một địa chỉ khác nhưng vẫn phải xử lý back-end (ví dụ: yêu cầu tạo báo cáo chuyển hướng đến trang trạng thái tạo báo cáo trong khi nó tiếp tục tạo báo cáo ở chế độ nền)
Mark Cidade

Ai đó có thể giải thích một tình huống hữu ích cho PageParser.GetCompiledPageInstance (..) không? Các tài liệu nói về việc sử dụng cơ sở hạ tầng - nó trả về loại IHttpHandler vì vậy tôi không thấy nó có thể được sử dụng thực tế như thế nào.
John K

@jdk: Trước đây tôi đã sử dụng nó khi ghi đè trình xử lý mặc định cho các yêu cầu * .aspx để tôi có thể sử dụng các đối tượng IHttpHandler trong bộ nhớ động mà còn sử dụng GetCompiledPageInstance () cho các tệp * .aspx vật lý.
Đánh dấu Cidade

70

Chế độ bán lẻ ở cấp machine.config:

<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

Ghi đè cài đặt web.config để thực hiện gỡ lỗi thành false, bật lỗi tùy chỉnh và vô hiệu hóa theo dõi. Không còn quên thay đổi thuộc tính trước khi xuất bản - chỉ cần để tất cả chúng được cấu hình cho môi trường phát triển hoặc thử nghiệm và cập nhật cài đặt bán lẻ sản xuất.


1
Đôi khi tôi quên thay đổi gỡ lỗi biên dịch thành false trước khi xuất bản, điều này ảnh hưởng tiêu cực đến hiệu suất. Không còn vấn đề nữa!
Roy Tinker

59

Kích hoạt intellisense cho MasterPages trong các trang nội dung
Tôi chắc chắn đây là một hack rất ít được biết đến

Hầu hết thời gian bạn phải sử dụng phương thức findcontrol và bỏ các điều khiển trong trang chính từ các trang nội dung khi bạn muốn sử dụng chúng, lệnh MasterType sẽ kích hoạt intellisense trong phòng thu trực quan khi bạn thực hiện điều này

chỉ cần thêm một chỉ thị vào trang

<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>

Nếu bạn không muốn sử dụng Đường dẫn ảo và sử dụng tên lớp thay thế

<%@ MasterType TypeName="MyMainMasterPage" %>

Nhận toàn bộ bài viết ở đây


Sử dụng FindControl đôi khi có thể rất bận rộn, cảm ơn vì mẹo tuyệt vời này!
Alexandre Brisebois

4
Sử dụng điều này có thể dẫn đến hành vi bất ngờ. Xem stackoverflow.com/questions/1998931/
Mạnh

Cá nhân tôi nghĩ rằng tính năng này không được mọi người biết đến, nó kết hợp trang này với trang chủ. Nếu bạn kết thúc bằng cách sử dụng các thuộc tính / phương pháp của trang chủ và sau đó thay đổi trang chủ, bạn sẽ gặp phải một cơn ác mộng bảo trì.
Phill

@Phil: Đôi khi nó là cần thiết và có quyền truy cập được nhập tĩnh vào một trang chủ tốt hơn nhiều so với phương pháp FindControl. Ít nhất bạn có được thông báo trình biên dịch và có thể nhanh chóng sửa nó.
Durden81

58

HttpContext.Items như một công cụ bộ nhớ đệm cấp yêu cầu


2
Đây cũng sẽ là quan điểm của tôi, tôi sử dụng điều này trong các điều khiển lồng nhau để truyền / nhận thông tin cấp yêu cầu. Ii cũng sử dụng điều này trong MVC để lưu trữ danh sách các tệp js để chắp thêm, dựa trên các chế độ xem một phần.
Tracker1

1
Tôi sử dụng điều này khi tôi sử dụng định tuyến asp.net để truyền các tham số được tìm nạp từ các url đến các trang của tôi. (không phải với MVC) tuyệt vời để viết lại url và khá linh hoạt.
Alexandre Brisebois

Hmmmm, chỉ cần nghĩ về một nơi nào đó mà tôi có thể đã sử dụng cái này thay vì Phiên - ta!
Mike Kingscott

52

Hai điều nổi bật trong đầu tôi:

1) Bạn có thể bật và tắt Trace từ mã:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2) Bạn có thể tạo nhiều trang .aspx chỉ bằng một tệp "mã phía sau" được chia sẻ.

Xây dựng một tệp .cs lớp:

public class Class1:System.Web.UI.Page
    {
        public TextBox tbLogin;

        protected void Page_Load(object sender, EventArgs e)
        {

          if (tbLogin!=null)
            tbLogin.Text = "Hello World";
        }
    }

và sau đó bạn có thể có bất kỳ số lượng trang .aspx nào (sau khi bạn xóa .designer.cs và .cs mã phía sau mà VS đã tạo):

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

Bạn có thể có các điều khiển trong ASPX không xuất hiện trong Class1 và ngược lại, nhưng bạn cần phải nhớ lại để kiểm tra các điều khiển của bạn xem có null không.


Tôi đã bỏ phiếu này, nhưng hết phiếu. Tôi sẽ cố gắng và nhớ trở lại để bỏ phiếu này. Tôi không biết rằng chúng ta có thể có cùng một tệp Code đằng sau cho nhiều trang. Không chắc chắn, làm thế nào sẽ làm việc.
Vaibhav

5
Có ai khác nghĩ rằng đó là một rủi ro bảo mật để cho phép bạn kích hoạt theo dõi từ một url không? (# 1) Tôi sẽ không đánh giá thấp câu hỏi này, nhưng điều quan trọng là phải hiểu rủi ro ở đó.
Kevin Goff

5
Tuyệt đối, bạn thực sự nên đặt mã đó vào khối #ifdef DEBUG #endif
Radu094

Bình luận tuyệt vời, chỉ ra khía cạnh bảo mật.
Vaibhav

2
Tại sao đó là rủi ro bảo mật để kích hoạt dấu vết từ url? Làm thế nào nó có thể được sử dụng để làm hại tôi?
Kamarey

48

Bạn có thể dùng:

 Request.Params[Control.UniqueId] 

Để có được giá trị của điều khiển TRƯỚC khung nhìn được khởi tạo (Control.Text, v.v. sẽ trống ở điểm này).

Điều này rất hữu ích cho mã trong init.


Khởi tạo Viewstate không xử lý với Request.Params. Sử dụng nó TRƯỚC KHI nâng cao phương thức LoadPostData của điều khiển được triển khai IPostBackDataHandler.
chapluck

46

WebMethods.

Bạn có thể sử dụng các cuộc gọi lại ASP.NET AJAX cho các phương thức web được đặt trong các trang ASPX. Bạn có thể trang trí một phương thức tĩnh với các thuộc tính [WebMethod ()] và [ScriptMethod ()]. Ví dụ:

[System.Web.Services.WebMethod()] 
[System.Web.Script.Services.ScriptMethod()] 
public static List<string> GetFruitBeginingWith(string letter)
{
    List<string> products = new List<string>() 
    { 
        "Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
    };

    return products.Where(p => p.StartsWith(letter)).ToList();
}

Bây giờ, trong trang ASPX của bạn, bạn có thể làm điều này:

<form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        <input type="button" value="Get Fruit" onclick="GetFruit('B')" />
    </div>
</form>

Và gọi phương thức phía máy chủ của bạn thông qua JavaScript bằng cách sử dụng:

    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>

45

Kiểm tra xem máy khách có còn kết nối không, trước khi bắt đầu tác vụ dài hạn:

if (this.Response.IsClientConnected)
{
  // long-running task
}

44

Một tính năng ít được biết đến và hiếm khi được sử dụng của ASP.NET là:

Ánh xạ thẻ

Nó hiếm khi được sử dụng vì chỉ có một tình huống cụ thể mà bạn cần nó, nhưng khi bạn cần nó, nó rất tiện dụng.

Một số bài viết về tính năng ít biết này:

Ánh xạ thẻ trong ASP.NET
bằng cách sử dụng ánh xạ thẻ trong ASP.NET 2.0

và từ bài viết cuối cùng đó:

Ánh xạ thẻ cho phép bạn trao đổi các điều khiển tương thích tại thời gian biên dịch trên mỗi trang trong ứng dụng web của bạn. Một ví dụ hữu ích là nếu bạn có một điều khiển ASP.NET chứng khoán, chẳng hạn như DropDownList và bạn muốn thay thế nó bằng một điều khiển tùy chỉnh có nguồn gốc từ DropDownList. Đây có thể là một điều khiển đã được tùy chỉnh để cung cấp bộ nhớ đệm dữ liệu tra cứu được tối ưu hóa hơn. Thay vì chỉnh sửa mọi hình thức web và thay thế DropDownLists tích hợp bằng phiên bản tùy chỉnh của bạn, bạn có thể thực hiện ASP.NET cho bạn bằng cách sửa đổi web.config:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

Điều này sẽ rất khó hiểu đối với các nhà phát triển khác trong nhóm của bạn
Aykut Akıncı

1
@Aykut - Thật vậy, đó là lý do tại sao tôi nói rằng tính hữu dụng của nó khá hẹp, tuy nhiên, khi được yêu cầu, nó rất tiện dụng. Ngoài ra, tôi sẽ đảm bảo rằng mọi cách sử dụng Ánh xạ thẻ được ghi lại rất rõ ràng để tránh mọi nhầm lẫn và mơ hồ.
CraigTP

43

Các mô đun . Các kiến ​​trúc là thanh lịch điên rồ. Có lẽ không phải là một tính năng ẩn, nhưng mát mẻ không kém.


3
HttpModules là một thứ gì đó tiên tiến, nhưng tôi sẽ không gọi nó là hiếm hoặc ít được sử dụng (hoặc gọi tôi là ngây thơ). Nhưng vâng, tôi yêu kiến ​​trúc.
Vaibhav

+1 vì rất nhiều nhà phát triển dày dạn có thể biết về HttpModules nhưng không hiểu đầy đủ mối quan hệ của họ với các yêu cầu. (Điều tương tự với HttpHandlers)
John Bubriski

34

Bạn có thể sử dụng Nhận xét ASP.NET trong một trang .aspx để nhận xét toàn bộ các phần của trang bao gồm các điều khiển máy chủ. Và nội dung được bình luận sẽ không bao giờ được gửi cho khách hàng.

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>

5
Có những người thực sự không biết rằng có ý kiến?
Joe Phillips

7
Tôi thích nó khi bạn tìm thấy một nửa trang aspx trong <! - bình luận ...
Bryan Rehbein

Đây là tính năng khá đơn giản của ASP.NET
rafek

34

Trình tạo biểu thức mã

Đánh dấu mẫu:

Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'

Vẻ đẹp thực sự của trình xây dựng biểu thức mã là bạn có thể sử dụng cơ sở dữ liệu giống như biểu thức trong các tình huống không liên kết dữ liệu. Bạn cũng có thể tạo Trình tạo biểu thức khác thực hiện các chức năng khác.

web.config:

<system.web>    
    <compilation debug="true">
        <expressionBuilders>
            <add expressionPrefix="Code" type="CodeExpressionBuilder" />

Lớp cs làm cho tất cả xảy ra:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 

1
bạn có ý nghĩa gì với "và những người khác" trong tiêu đề?
Khaled Musaied

Tôi đoán tôi không bao giờ có được với những người khác.
andleer

2
+1, tính năng thực sự thú vị ... Điều đó thực sự khá giống với các tiện ích mở rộng đánh dấu của WPF
Thomas Levesque

Đây không giống như sử dụng <%= /*code*/ %>?
bevacqua

33

Sử dụng loại tệp ASHX:
Nếu bạn chỉ muốn xuất một số html hoặc xml cơ bản mà không cần thông qua trình xử lý sự kiện trang thì bạn có thể triển khai HTTPModule một cách đơn giản

Đặt tên trang là someHandlerPage.ashx và chỉ cần đặt mã dưới đây (chỉ một dòng) trong đó

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

Sau đó, tập tin mã

using System;
using System.IO;
using System.Web;

namespace MyNamespace
{
    public class MyHandler: IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";
            string myString = SomeLibrary.SomeClass.SomeMethod();
            context.Response.Write(myString);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}

5
Điều đáng chú ý là bạn nên thêm IRequiresSessionState hoặc IReadOnlySessionState nếu bạn cần, nếu không nó sẽ không ở đó.
Tracker1

3
Cũng đáng lưu ý rằng bạn có thể chỉ định thiết lập trình xử lý trong web.config để bạn không cần phải có tệp ashx vật lý xung quanh. Hoặc bạn có thể đăng ký trình xử lý theo chương trình trong ứng dụng của bạn bắt đầu trong asax toàn cầu.
Phill



26

Tôi đã làm việc trên một ứng dụng asp.net đã trải qua một cuộc kiểm toán bảo mật của một công ty bảo mật hàng đầu và tôi đã học được mẹo đơn giản này để ngăn chặn một lỗ hổng bảo mật ít được biết đến nhưng quan trọng.

Giải thích dưới đây là từ: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guiances_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_C gặp_One-Click_Attacks

Cân nhắc sử dụng Page.ViewStateUserKey để chống lại các cuộc tấn công bằng một cú nhấp chuột. Nếu bạn xác thực người gọi và sử dụng ViewState, hãy đặt thuộc tính Page.ViewStateUserKey trong trình xử lý sự kiện Page_Init để ngăn chặn các cuộc tấn công bằng một cú nhấp chuột.

void Page_Init (object sender, EventArgs e) {
  ViewStateUserKey = Session.SessionID;
}

Đặt thuộc tính thành giá trị bạn biết là duy nhất cho mỗi người dùng, chẳng hạn như ID phiên, tên người dùng hoặc số nhận dạng người dùng.

Tấn công bằng một cú nhấp chuột xảy ra khi kẻ tấn công tạo một trang Web (.htm hoặc .aspx) có chứa trường biểu mẫu ẩn có tên __VIEWSTATE đã được điền với dữ liệu ViewState. ViewState có thể được tạo từ một trang mà kẻ tấn công đã tạo trước đó, chẳng hạn như trang giỏ hàng với 100 mục. Kẻ tấn công dụ người dùng không nghi ngờ vào trình duyệt trang và sau đó kẻ tấn công khiến trang được gửi đến máy chủ nơi ViewState hợp lệ. Máy chủ không có cách nào để biết rằng ViewState có nguồn gốc từ kẻ tấn công. Xác thực ViewState và HMAC không chống lại cuộc tấn công này vì ViewState hợp lệ và trang được thực thi trong bối cảnh bảo mật của người dùng.

Bằng cách đặt thuộc tính ViewStateUserKey, khi kẻ tấn công duyệt đến một trang để tạo ViewState, thuộc tính được khởi tạo thành tên của anh ta hoặc cô ta. Khi người dùng hợp pháp gửi trang đến máy chủ, nó được khởi tạo với tên của kẻ tấn công. Kết quả là, kiểm tra ViewState HMAC không thành công và một ngoại lệ được tạo ra.


2
Cũng nhớ để lại cơ sở.OnInit (e); để hàm Page_Init () thực hiện công việc của nó.
Druid

Tôi nghĩ rằng thủ thuật này có thể thất bại nếu người dùng thực sự không chấp nhận cookie hoặc nếu sessionid có thời gian chờ.
Aristos

1
Bạn không cần base.OnInit(e);nếu bạn đang sử dụng AutoEventWireup="true"cho trang.
Adam Nofsinger

1
Druid: Anh ta không ghi đè OnInit (trong trường hợp đó, base.OnInit (e) sẽ là cần thiết).
crdx

Sử dụng ID phiên cho ViewStateUserKey chỉ hoạt động sau khi phiên thực sự bắt đầu. Điều đó cũng có nghĩa là các trang này có thể hết thời gian chờ sau khi phiên hết hạn. Trong trường hợp những vấn đề đó là mối quan tâm, bạn có thể cân nhắc sử dụng một cái gì đó bền hơn, chẳng hạn như địa chỉ IP của người dùng.
RickNZ

25

HttpContext.Cản.IsDebuggingEnables

Điều này rất tốt để xác định tập lệnh nào sẽ xuất (phiên bản tối thiểu hoặc đầy đủ) hoặc bất kỳ tập lệnh nào bạn có thể muốn trong dev, nhưng không tồn tại.


Tôi đồng ý với Jan, nhưng đôi khi thật thú vị khi có một ứng dụng nhận thức được trạng thái thực thi của nó Gỡ lỗi / Phát hành.
Alexandre Brisebois

20

Bao gồm trong ASP.NET 3.5 SP1:

  • customErrors hiện hỗ trợ thuộc tính "redirectMode" với giá trị là "FeedbackRewrite". Hiển thị trang lỗi mà không thay đổi URL.
  • Thẻ biểu mẫu bây giờ nhận ra thuộc tính hành động. Tuyệt vời khi bạn đang sử dụng viết lại URL

20

Thuộc tính DefaultButton trong Bảng.

Nó đặt nút mặc định cho một bảng cụ thể.


1
Chú ý, không hoạt động trên tất cả các loại nút, ví dụ: LinkButtons!
Kovu


19

Sử dụng configSource để phân chia tập tin cấu hình.

Bạn có thể sử dụng thuộc tính configSource trong tệp web.config để đẩy các thành phần cấu hình sang các tệp .config khác, ví dụ, thay vì:

    <appSettings>
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

... bạn có thể lưu toàn bộ phần Cài đặt ứng dụng trong tệp cấu hình khác. Đây là cái mới web.config:

    <appSettings configSource="myAppSettings.config" />

Các myAppSettings.configtập tin:

    <appSettings>        
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

Điều này khá hữu ích cho các tình huống khi bạn triển khai ứng dụng cho khách hàng và bạn không muốn chúng can thiệp vào tệp web.config và chỉ muốn chúng có thể thay đổi chỉ một vài cài đặt.

ref: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/USE-configsource-to-split-configuration-files.aspx


1
Điều này cũng đang làm việc trên bất kỳ loại dự án .net, ứng dụng máy tính để bàn cũ. cấu hình
Zoltan Veres


16

HttpContext.IsCustomErrorEnables là một tính năng thú vị. Tôi đã thấy nó hữu ích hơn một lần. Đây là một bài viết ngắn về nó.


16

Theo mặc định, mọi nội dung giữa các thẻ cho điều khiển tùy chỉnh sẽ được thêm dưới dạng điều khiển con. Điều này có thể bị chặn trong ghi đè AddParsedSubObject () để lọc hoặc phân tích cú pháp bổ sung (ví dụ: nội dung văn bản trong LiteralControls):

    protected override void AddParsedSubObject(object obj)
     { var literal = obj as LiteralControl;
       if (literal != null) Controls.Add(parseControl(literal.Text));
       else base.AddParsedSubObject(obj);
     }

...

   <uc:MyControl runat='server'>
     ...this text is parsed as a LiteralControl...
  </uc:MyControl>

13

Nếu bạn có ASP.NET tạo nguồn cấp RSS, đôi khi nó sẽ đặt thêm một dòng ở đầu trang. Điều này sẽ không xác nhận với các trình xác nhận RSS phổ biến. Bạn có thể làm việc xung quanh nó bằng cách đặt chỉ thị trang <@Page>ở dưới cùng của trang.


7
Bạn sẽ không làm tốt hơn khi sử dụng trình xử lý .ASHX để tạo nguồn cấp RSS?
Dan Diplo

Tôi đoán điều đó phụ thuộc vào sự phức tạp của dự án. Không phải ai cũng có khả năng hoặc kỹ năng để tạo và biên dịch trình xử lý. Trong trang asp.net hoạt động hợp lý tốt cho việc này
Kevin Goff

1
Và bạn có thể sử dụng một cái gì đó như <asp: Repeater> để tạo các mục RSS và thực hiện các thủ thuật khác (chẳng hạn như sử dụng LogInView để xóa một số mục) tốt hơn nhiều so với việc viết các chuỗi từ ASHX IMO
chakrit

LinqToXml + ASHX là con đường để đi!
Carlos Muñoz

Điều này hữu ích cho nhiều hơn so với tạo RSS. IIRC, HTML5 phải có thẻ <! Doctype html> trên dòng đầu tiên ở trên cùng để xác thực chính xác.
Roy Tinker

12

Trước khi ASP.NET v3.5 thêm các tuyến, bạn có thể tạo các URL thân thiện của riêng mình chỉ bằng cách viết HTTPModule và viết lại yêu cầu sớm trong đường dẫn trang (như sự kiện BeginRequest).

Các Url như http: // servername / page / Param1 / someParams1 / Param2 / someParams2 sẽ được ánh xạ tới một trang khác như bên dưới (thường sử dụng các biểu thức thông thường).

HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");

DotNetNuke có một HTTPModule thực sự tốt, thực hiện điều này cho các url thân thiện của họ. Vẫn hữu ích cho các máy mà bạn không thể triển khai .NET v3.5.


Điều này yêu cầu ánh xạ tất cả các yêu cầu IIS sang ASP.NET
John Sheehan

Hoặc chỉ là trình xử lý lỗi 404.
FlySwat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.