博文
IIS权限设置(2009-07-16 00:08:00)
摘要:
IIS Web 服务器的权限设置有两个地方,一个是 NTFS 文件系统本身的权限设置,另一个是 IIS 下 网站->默认网站->右击属性->虚拟目录 面板上。这两个地方是密切相关的。下面我会以实例的方式来讲解如何设置权限。
IIS5.1下 网站->默认网站->右击属性->虚拟目录 面板上有:
脚本资源访问:用户可以对网站目录的脚本文件有操作的权限,前提是开启读取或者写入权限,开启读取权限就有读取脚本文件(源代码)的权限,开启写入权限就有写入脚本文件的权限。
读取:用户可以访问网站的文件,建立网站的时候默认开启读取权限。
写入:用户可以写入文件到网站目录,也就是我们所说的写权限漏洞。
如果开启写入权限不开启脚本资源访问权限,则只有上传普通文件的权限,没有修改为脚本文件后缀的权限。
目录浏览:用户可以查看网站目录的所有文件和目录。前提是开启读取权限。
记录访问:授予此权限可在日志文件中记录对此文件夹的访问。只有在为网站启用了日志记录时才会记录日志条目。
索引资源:授予此权限将允许 Microsoft 索引服务在网站的全文索引中包含该文件夹。授予此项权限后,用户将可以对此资源执行查询。
6 个选项。这 6 个选项中,“记录访问”和“索引资源”跟安全性关系不大,一般都设置。但是如果前面四个权限都没有设置的话,这两个权限也没有必要设置。在设置权限时,记住这个规则即可,后面的例子中不再特别说明这两个权限的设置。
另外在这 6 个选项下面的【虚拟目录】|【应用程序设置】|【执行权限】下拉列表中还有“无”、“纯脚本”和“纯脚本和可执行程序”3 个选项。
“纯脚本”:单击此设置可在服务器上运行诸如 ASP 程序之类的脚本。
“脚本和可执行文件”:单击此设置可在服务器上同时运行 ASP 程序之类的脚本和可执行程序。
IIS 5.1新建虚拟目录,默认情况下,勾选了读取、记录访问和索引资源,执行权限为“纯脚本”,应用程序保护为“中(共用)”。在文档标签中勾选了“启用默认文档”。目录安全性选项中启用了匿名访问,匿名访问账户为IUSR_,勾选了“允许IIS控制密码”。
网站目录如果在 NTFS 分区(推荐用这种)的话,还需要对 NTFS 分区上的这个目录设置相应权限,许多地方都介绍设置......
继承本质论(2008-10-19 00:14:00)
摘要:1.对象的创建过程
Bird bird创建的是一个Bird类型的引用,而new Bird()完成的是创建Bird对象,分配内存空间和初始化操作,然后将这个对象引用赋给bird变量,也就是建立bird变量与Bird对象的关联。
2.从继承的角度分析对象的创建过程
在此我们以Chicken对象的创建为例,首先是字段,对象一经创建,会首先找到其父类Bird,并为其字段分配存储空间,而Bird也会继续找到其父类Animal,为其分配存储空间,依次类推直到递归结束,也就是完成System.Object内存分配为止。
思考
通过上面的讲述与分析,我们基本上对.NET在编译期的实现原理有了大致的了解,但是还有以下的问题,一定会引起一定的疑惑,那就是: Bird bird2 = new Chicken();
这种情况下,bird2.ShowType应该返回什么值呢?而bird2.type又该是什么值呢?有两个原则,是.NET专门用于解决这一问题的:
关注对象原则:调用子类还是父类的方法,取决于创建的对象是子类对象还是父类对象,而不是它的引用类型。例如Bird bird2 = new Chicken()时,我们关注的是其创建对象为Chicken类型,因此子类将继承父类的字段和方法,或者覆写父类的虚方法,而不用关注bird2的引用类型是否为Bird。引用类型不同的区别决定了不同的对象在方法表中不同的访问权限。
注意
根据关注对象原则,那么下面的两种情况又该如何区别呢?
Bird bird = new Chicken();
Chicken chicken = new Chicken ();
根据我们上文的分析,bird对象和chicken对象在内存布局上是一样的,差别就在于其引用指针的类型不同:bird为Bird类型指针,而chicken为Chicken类型指针。以方法调用为例,不同的类型指针在虚拟方法表中有不同的附加信息作为标志来区别其访问的地址区域,称为offset。不同类型的指针只能在其特......
C#Doorstep2面向对象程序设计篇8(2008-04-03 16:42:00)
摘要:
事件
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其它的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。这个媒介就是委托。
新建一个Windows窗体应用程序,接口上放置一个卷标,一个框架,框架上放置5个按钮。界面如下。各按钮Tag依次为0、1、2、3、4,给按钮添加单击事件,5个按钮的单击事件处理函数均为button1_Click。
//挡位元元元元模拟案例演示如何通过委托来定义事件。
//Form1.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Exam2_13
{
public class Form1 : System.Windows.Forms.Form
{
//窗体设计器自动生成的代码略
static void Main()
{
Application.Run(new Form1());
}
priv......
C#Doorstep2面向对象程序设计篇7(2008-04-03 16:40:00)
摘要:
委托
委托属于引用类型,其作用类似于 C++中函数指针的用途。与函数指针不同,委托实例独立于它所封装的方法的类;最主要的是那些方法与委托的类型是兼容的。另外,函数指针只能引用静态函数,而委托可以引用静态和实例方法。委托最大的特点是它不知道或不关心自己所引用的对象的类,任何对象中的方法都可以通过委托动态的调用,只要方法的参数类型和返回类型必须和委托匹配。
using System;
public delegate void D(int x);
class C
{
public static void F1(int i)
{
Console.WriteLine("C.F1: " + i);
}
public void F2(int i)
{
Console.WriteLine("C.F2: " + i);
}
}
class Test
{
static void Main()
{
D cd1 = new D(C.F1); //此处为静态方法的调用
C c = new C();
D cd2 = new D(c.F2); //此处为非静态方法的调用 &n......
C#Doorstep2面向对象程序设计篇6(2008-04-03 16:38:00)
摘要:
密封类(sealed)
C#提供一种不能被继承的类,称为密封类。密封类的声明方法是在类名前加上sealed修饰符。修饰符abstract和sealed不能同时使用。
密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。
在类声明中使用 sealed 修饰符可防止继承此类,sealed 的class只能实例化。例如:
sealed class SealedClass
{
public int x;
public int y;
}
将密封类用作基类或将 abstract 修饰符与密封类一起使用是错误的。
结构是隐式密封的;因此它们不能被继承。
// cs_sealed_keyword.cs
using System;
sealed class SealedClass
{
public int x;
public int y;
}
class MainClass
{
static void Main()
{
SealedClass sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
Console.ReadKey();
}
}
在前面的示例中,如果试图通过使用下面的语句从密封类继承:
class MyDerivedC: MyClass {} // Error
将收到错误信息:
'MyDerivedC' cannot inherit from sealed class 'MyClass'.
抽象类
当创建一个类时,有时需要让该类包含一些特殊的方法,该类对这些方法不提供具体实......
C#Doorstep2面向对象程序设计篇5(2008-04-03 16:34:00)
摘要:
多态性
C#的多态性主要体现在方法(虚函数)重载上。
多态性是指不同的对象收到相同的消息时,会产生不同动作。从而实现“一个接口,多个方法”。它允许以相似的方式来对待所有的派生类,尽管这些派生类是各不相同的。例如动物Animal类的不同实体(猫,狗,猪,牛…)的叫声都各不相同,它们的睡姿也大为迥异。
C#支持两种类型的多态性:
(1)编译时的多态性是通过重载类实现的,系统在编译时,根据传递的参数个数、类型信息决定实现何种操作。
(2)运行时的多态性是指在运行时,根据实际情况决定实现何种操作。C#中运行时的多态性通过虚函成员实现。
类中两个以上的方法(包括隐藏的继承而来的方法)取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法,这就叫做方法的重载。这样就实现了“一个接口,多种动作”。
如果希望基类中某个方法能够在派生类中进一步得到改进,那么可以把这个方法在基类中定义为虚方法。类中的方法前加上了virtual修饰符成为虚方法,反之为非虚方法。使用了virtual修饰符后不允许再有static,abstract或override修饰符。
普通方法重载要求方法名称相同,参数类型和参数个数不同,而虚方法重载要求方法名称、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载要求在声明中加上override关键词,而不能有new、static或virtual修饰符。
类成员的可访问性
public 访问不受限制
internal 访问权限是当前的程序集(可以简单理解为项目),也就是exe或者dll檔如果在同一个程序集中,假如有一个类A,其它类中想要使用A中的属性或方法的话,不管是new方法产生的还是继承产生的,都可以访问到protected internal和internal的方法。
但是如果A类不是在同一个程序集中,就有很大的区别了,首先,你用new方法产生对象中,不可以使用protected internal或internal来访问。继承的方式可以访问到protected internal,但不可访问internal。 当你写的一些类,不想让外部......
C#Doorstep2面向对象程序设计篇4(2008-04-03 16:31:00)
摘要:结构
一个类中的若干成员可以组合成结构体struct来处理。
事件 委托等概念请见后面解析。
静态成员与实例成员
C#的类定义中可以包含两种成员:静态成员和非静态成员(也即实例成员)。使用了static修饰符的方法为静态成员,反之则是实例成员。
(1)使用static修饰符声明属于类型本身而不是属于特定对象的静态成员。static修饰符可用于字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类型。
(2)静态成员属于类,在内存中只有一份,不必建立该类的实例,通过类名即可使用;而实例成员属于用该类创建的实例,要通过对象名使用。
(3)非静态方法可以访问类中包括静态方法在内的所有成员,而静态方法只能访问类中的静态成员。
类的方法前加了static关键词,则该方法为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,也可以通过类来使用。但一般提倡通过类名来使用,因为静态方法只要定义了类,不需用建立类的实例就可使用。静态方法只能使用类的静态成员。
实例方法必须通过类的实例来使用。实例方法可以使用类的非静态成员,也可以使用类的静态成员。
using System;
namespace Exam2_4
{
class Test
{
public int a;
//非静态成员
public static int b; //静态成员
public Test(int m, int n) //构造函数
......
C#Doorstep2面向对象程序设计篇3(2008-04-03 16:27:00)
摘要:索引器
索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同的是索引器包含参数。
定义索引的方式和定义属性非常类似,主要有两部分:使用this关键词。定义一个索引值。
//本案例说明如何声明私有数组字段元元元myArray和索引器。通过使用索引器可直接访问实例 b[i]
using System;
class IndexerClass
{
private int [] myArray = new int[100];
public int this [int index] //索引声明
{
get
{
if(index < 0 || index >= 100)
return 0;
else
return myArray[index];
......
C#Doorstep2面向对象程序设计篇2(2008-04-03 16:18:00)
摘要:方法(成员函数)
在C#中,数据和操作均封装在类中,数据是以成员变量的形式出现,而对数据的操作主要体现在方法的使用上。在类中,方法的一般格式为:
[方法修饰符] 返回值类型 方法名([参数列表]){方法体}
[方法修饰符] 默认为internal
Person类中定义了方法:public void Display(){} 实现从控制台输出人的姓名、性别和年龄。
C#方法(函数)的参数有四种类型:值参数、引用参数、输出参数和参数数组。
未用任何修饰符声明的参数为值参数。值参数在调用该参数所属的函数成员(方法、实例构造函数、访问器和运算符)时创建,并用调用中给定的实参值初始化。当从该函数返回时值参数被销毁。对值参数的修改不会影响到原自变量。值参数通过复制原自变量的值来初始化。
以下实例演示了四种参数传递方式。
using System;
namespace Exam2_3
{
class Class1
{
static void Swap(int a,int b)//a,b为值参数
{
int t;
t=a;a=b;b=t;
}
static void Swap1(ref int a,ref int b)//a,b为......
C#Doorstep2面向对象程序设计篇1(2008-04-03 16:12:00)
摘要:C#Doorstep2面向对象程序设计篇
一.面向对象机制
二.类和对象
1.类和对象的概念
--构造函数
--析构函数
--域(成员变量)
--方法(成员函数)
--属性 {get(),set()}
--索引器
--运算符 (operator)
-- 静态成员与实例成员 (static)
2.面向对象的基本特征
--类的继承
--多态性
--类成员的可访问性(private,protected,public,internal)
--密封类(sealed)
--抽象类(abstract)
--接口(interface)
--委托(delegate)
--事件(event)
一.面向对象机制
面向对象编程主要思想是将数据以及处......