2011-02-26 40 views
1

本周我们的服务器上出现了一个非常奇怪的问题,其中一个aspx脚本中的方法(没有代码隐藏文件)以某种方式从其他地方的完全不相关的页面调用我们的网站。基本上,剧本这样说:在其他脚本中使用ASPX页面的公共方法

<script language="c#" runat="server"> 
    public void Page_Load(object sender, EventArgs e) 
    { 
     // some initializer logic 
     PageMethod("data"); 
    } 
    public string PageMethod (string strInput) 
    { 
     // More logic 
    } 
    </script> 

我们经营的四台服务器一个农场,我们看到了PageMethod过得去的所有服务器上的几个地方脚本调用,所以当我的第一反应是,这是一个已损坏缓存在服务器上(我仍然怀疑它可能),我的直觉告诉我,我们允许这发生在我们的代码中。我们一直在使用这种代码风格的yonks,但最近升级我们的服务器到.NET 2.0。

我的第一个问题是,如果在某个网站的其他地方的脚本中可以访问aspx中的每个public方法?我的第二个问题是,如果我们在aspx页面上使用privateprotected方法(我总是认为独立页面中的代码是自包含的,所以草率的访问修饰符应该没有区别)。

(注:我不写太多C#,所以我的语言的把握是非常简单,只是理论上的,我只是想成为一个真正的问题之前解决此问题)

+0

您能否提供有关您所看到/看到的内容的更多信息,从而促使您认为这些方法是来自不相关网页的呼叫?你在哪里“看到”PageMethod被称为?在你的日志中?这种情况下完整的网址是什么? – 2011-02-26 09:23:32

+0

是否有其他页面有一个名为“Page_Method”的方法?不知道你如何确定(或者认为)其他请求正在调用这个特定页面的方法,这很难说。 – 2011-02-26 09:43:42

+0

@Shiv库马尔,我们的服务器捕获所有未处理的异常的堆栈跟踪,所以我可以看到脚本崩溃的Page_Load,紧跟在Page_Load之后,我看到了对PageMethod的调用。但是这两页之间绝对没有联系。它几乎看起来像是一个缓冲区溢出问题。 – Andrew 2011-02-26 11:13:52

回答

1

我的第一个问题是,如果一个aspx中的公共方法每个都可以访问网站上其他地方的脚本?

为了调用公共实例方法,需要该类的一个实例。我怀疑你的问题与其他直接调用此方法的脚本无关。有更多的HTTP请求被发送到相应的ASPX页面,ASPX页面会调用该方法。这个请求可以由客户端(页面上的某个链接,...)或者直接由服务器完成(使用HttpWebRequest)。要进一步调试问题,请尝试查看Web服务器日志文件以查看对此页面所做的所有请求。

我的第二个问题是,我们应该使用在aspx页面私人或受保护的方法(我总在一个独立的页面的代码是自包含的,所以马虎访问修饰符不应该有所作为) 。

如果这些方法不打算被代码的其他部分使用,那么将它们设置为私有或受保护并且不仅与ASP.NET相关是一种很好的做法。

+0

谢谢Darin。我也对@Shiv进行了评论,但是我在堆栈跟踪中看到的是在另一个无关的脚本上调用Page_Load,紧接着该脚本的公共方法调用。我没有收到堆栈跟踪中返回的行号,所以我不能100%确定我看到的Page_Load实际上属于用户正在调用的脚本,但我看不到任何理由它会被误导。这两个脚本之间绝对没有联系。 – Andrew 2011-02-26 11:19:47

1

这可能是最好的做法像PageMethod私人或受保护。我相信Page_Load和其他页面生命周期方法必须是公开的,但其他页面生命周期方法不会。 asp.net生成的类可以像其他任何类一样访问,尽管有时候它们很难找到。在那里我通常会看到奇怪的地方就是有人抄袭了一个aspx页面,却忽略了改变页面指令,这样你就可以在前面看到多个代码,指向一个代码隐藏。

相关问题