RSS 2.0 Feed
无赖剽窃
摘要:Sql注入式攻击是指利用设计上的漏洞,在目标服务器上运行Sql 命令以及进行其他方式的攻击 动态生成Sql命令时没有对用户输入的数据进行验证是Sql注入攻击得逞的主要原因比如一个在线书店,可以根据用户的输入关键字搜索相关的图书。 string name = GetUserInput("BookName");string script = "select table_book where book_name? like? N'%" + name + RunSql(script)RunSql(script); 如果name? = " ' select @@servername where '' = ' ";这样就可以得到DB Server的名字 还以在线书店为例,用户只有登陆后才能察看自己的帐户信息,这样做是无可置疑的,然而用户验证的代码如下 //id和password直接来自用户的输入。未做处理string id = GetUserInput("UserID");string password = GetUserInput("UserPassword"); tring script = "select * from table_user where User_ID = '" + id? + "' and User_Password? = '" + password? + "' ";RunSql(script); 如果用户输入的password为“ or ''=' ”,那么生成的script就为select * from table_user where User_ID = 'UserID' and User_Password? = ' ' or ''=' ' 这样一来,即使不知道用户的密码也可以察看该用户的帐户信息了 再比如,入侵者会把一些巧妙伪装的代码嵌入到你动态生成的Sql命令中,比如Delete table_Book where 1 = 1? ...use master-- 上面的例子都是一些简单的示例,攻击者还可能通过sql的漏洞对操作系统进行攻击,比如运行[xp_cmdshell],[xp_regread] 当然实际上的攻击没有这么简单,攻击者还会利用系统设计的其他漏洞。比如程序把数据库返回的出错信息没有进行转换就直接输出给用户看,那么攻击者就设计一些sql语句诱导系统返回需要的信息 从上面的这些例子可以看出,对数据库访问权限的设计不当,给与每一个数据库连接太多的权限,甚至dbo或sa的权限,也是sql注入式攻击利用的主要漏洞之一。 ? 防范sql注入式攻击 最小权限原则。特别是不要用dbo或者sa账户,为不同的类型的动作或者组建使用不同的账户,最小权限原则适用于所有与安全有关的场合 对用户输入进行检查。对一些特殊字符,比如单引号,双引号,分号,逗号,冒号,连接号等进行转换或者过滤;使用强数据类型,比如你需要用户输入一个整数,就要把用户输入的数据转换成整数形式;限制用户输入的长度等等。这些检查要放在server运行,client提交的任何东西都是不可信的 使用存储过程,如果一定要使用sq语句,那么用标准的方式组建sql语句,比如可以利用parameters对象,避免用字符串直接拼sq命令。 当sql运行出错时,不要把数据库返回的错误信息全部显示给用户,错误信息经常会透露一些数据库设计的细节 针对常用的sql注入式攻击方式对症下药 参考 Advanced SQL Injection In SQL Server Applicationshttp://www.nextgenss.com/papers/advanced_sql_injection.pdf More Advanced SQL Injectionhttp://www.nextgenss.com/papers/more_advanced_sql_injection.pdf ?...[阅读全文]

posted @ | Feedback (3) |

摘要:原始出处Behind the scenes of ASPX files Asp.net Page文件通常有两个文件,aspx文件定义外观,cs文件((Code behind文件)处理事件,运行时,每一个cs文件会被编译成dll文件。当page第一次被访问的时候,1:.net会根据aspx文件生成一个cs文件2:用csc.exe把这个cs文件编译成dll3: 运行编译生成的这个dll 上面的过程只有第一次请求页面时才发生,所以第一次访问某个page时会感觉比较慢。以后.net就用dll来处理对这个页面的请求,如果aspx文件有变化,,net会重新生成dll文件生成的这个dll文件可以在C:\$WINDOWSDir$\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\$YourWebAppName$\4449be44\81bf2529(最后面两级目录的名字是随机的)目录下找到,我们可以看到这个目录下除了cs文件外还有其他类型的文件,其中 *.cs:??根据aspx文件生成的cs文件*.res ??资源文件*cmdline ?用来编译*.cs文件的命令行*.err? ??编译*.cs的错误*out ??编译时的输出文件*.dll ??编译生成的文件*pdb ??编译生成的文件*.xml??存储aspx文件名和.net生成的用来命名文件的随机数之间的映射关系我们可以看到Temporary ASP.NET Files\$YourWebAppName$\目录下的文件,除了xml文件之外都是以随机数字作为文件名,所以需要一个page 的实际名字与随机数字之间的映射关系,这个映射存储在xml文件中。比如 ??? ??? 我们根据这个映射,找到生成的cs文件 从cs文件里,我们可以看到,cs文件中标出了与aspx原文件相对应的行号比如 aspx文件中第三行为 相应的cs文件中#line 3 "F:\CRM\TestControl.ascx"__ctrl = new System.Web.UI.WebControls.TextBox(); ............. 另一方面,我们可以注意到每一个根据aspx文件生成的类都继承了aspx文件的code behind类,并且实现了其接口。 比如:??? public class TestControl_ascx : CRM.TestControl public class WebForm1_aspx : CRM.WebForm1, System.Web.SessionState.IRequiresSessionState 根据aspx文件生成的类先于code behide类被调用,其构造函数会初始化所依赖的文件 public WebForm1_aspx() {?System.Collections.ArrayList dependencies;??????????? if ((ASP.WebForm1_aspx.__initialized == false)) {??????????????? ASP.WebForm1_aspx.__stringResource = System.Web.UI.TemplateControl.ReadStringResource(typeof(ASP.WebForm1 _aspx));??????????????? dependencies = new System.Collections.ArrayList();??????????????? dependencies.Add("F:\\CRM\\webform1.aspx");??????????????? dependencies.Add("F:\\CRM\\bin\\CRM.DLL");??????????????? dependencies.Add("F:\\CRM\\TestControl.ascx");??????????????? ASP.WebForm1_aspx.__fileDependencies = dependencies;??????????????? ASP.WebForm1_aspx.__initialized = true;??????????? }??????????? this.Server.ScriptTimeout = 30000000;??????? } 其构造函数执行后,会执行override的函数FrameworkInitialize,函数FrameworkInitialize调用__BuildControlTree 来构造所有页面上的控件,综上所述,请求aspx页面时,有两个类参与1:code behind class ?– WebForm1.2:从ASPX生成的类?– adbdef. 执行的顺序为1:adbdef的构造函数2:WebForm1的构造函数3:adbdef类的方法FrameworkInitialize4:FrameworkInitialize调用__ BuildTree创建各个控件5:按顺序调用Page和controls的事件处理程序,ASPX中声明的事件先被处理附录:testcontrol.ascx <%@ Control Language="c#" AutoEventWireup="false" Codebehind="TestControl.ascx.cs" Inherits="CRM.TestControl" TargetSchema=" http://schemas.microsoft.com/intellisense/ie5"%>Label testcontrol.ascx.cs protected System.Web.UI.WebControls.Label Label1;protected System.Web.UI.WebControls.Button Button1;protected System.Web.UI.WebControls.TextBox TextBox1; private void......[阅读全文]

posted @ | Feedback (3) |

摘要:ASP.NET Data Web Controls: Providing DataGrid Pagination By Scott MitchellPaging through Records using a Stored Procedure By Daniel Anderson Paging In ASP.NET By Andrew Merlino   属性 AllowSorting: 是否允许分页PageSize: 页的大小CurrentPageIndex: 当前页,CurrentPageIndex应该大于等于0并且小于等于PageCountPageCount :页数VirtualItemCount: DataGrid需要根据Record的数目来计算页数,但是Custom Paging模式不需要一次得到所有的Record,所以需要显式为VirtualItemCount赋值 事件 PageIndexChanged: 改变PageIndex时触发。在PageIndexChanged中更新CurrentPageIndex属性并且重新绑定DataSource(一定要重新绑定,如果不重新绑定DataSource的话DataGrid会用ViewState的信息) 定制 用DataGridPagerStyle类或者来控制显示包括BackColor;Font;ForeColor;HorizontalAlign;Mode;NextPageText;PrevPageText;PageButtonCount;Position;Width 如果要自定义导航栏,比如1,2 -->[1],[2]可以在OnItemCreated事件里面实现,DataGrid的页导航栏是TableRow对象,包含一个跨越所有列的TableCell对象,要访问分页按钮,需要遍历TableRow的Controls集合,(分页按钮之间的空格也是控件,遍历时可以跳过) 如果要实现更复杂的导航栏,可以把DataGrid自带的导航栏的Visible属性设置为False,然后加入自己的导航栏,自定义的导航栏是与DataGrid可以是相互独立的。 更复杂的定制可以在OnItemCreated事件里面实现。 Default Paging模式 设置AllowSorting为True,只显示PageSize大小的reocrd如果DataGrid分页模式用Default Paging, 那么DataSource需要是一个实现ICollection接口的对象,因为DataGrid需要知道DataSouce对象有多少Record(DataSet实现了ICollection接口但是DataReader没有)。Default Paging模式下,会接受所有的Data,但是只显示其中一部分。 Custom Paging模式 如果DataGrid分页模式用Custom Paging,DataSource不需要实现ICollection,所以可以用DataReader。 获得VirtualItemCount可以用ExecuteScalar,ExecuteScalar执行查询,只返回查询所返回的结果集中第一行的第一列。 要计算某一个Reocrd是DataSource中的第几个reccord,可以在存储过程中借助一个含有递增field(比如:IncreasingID int IDENTITY(1,1))的临时表,但是此法不适用于数据量非常大的情况 对于以递增的整数为主键的table,可以把每页的最小主键的最大主键保存下来,然后结合select top和order by来实现分页(注意order by的顺序,要根据查看前一页还是查看后一页决定用DESC还是用ASC),不过这种方法不适用Mode="NumericPages" 或者用set rowcount xxxx来代替select top,不过不要忘了最后调用set rowcount 0 或者将DataSource的PrimaryKey排序后存入ArrayList中,然后根据PageSize,CurrentPageIndex,NewPageIndex等计算出此页的PrimaryKey范围,用Join和GetRange将该范围内的PrimaryKey组成一个字符串,传入存储过程select ... from ... where ... And PrimaryKeyColumn IN (...)。因为有Index的协助,对PrimaryKey的操作应该非常快。 或者用嵌套的select top语句,比如每页n条记录,要查看第m页, 可以 select top * from (    select top n * from         (select top n*m * from table_name order by primarykey)     order by primarykey desc)order by primarykey 说实话,这方法很笨 还有一种比较快的方法是利用Database的游标,例子如下 declare @pagesize int declare @page intdeclare @total intdeclare @start intdeclare @end intdeclare @maxid intdeclare @minid int set @pagesize = 10set @page = 0 ......[阅读全文]

posted @ | Feedback (4) |

摘要:问题: 如果连续Submit一个Form多次而未加处理的话,可能会引起错误。比如在一个新建Record的Asp.Net页面中,连续点Button : Save多次,就会连续提交Form,可能新建多个Record 解决方法: 在第一次处理提交的Form的时候,在Cache里Insert一个KeyCache.Insert(key, true,null,DateTime.Now.AddSeconds(context.Server.ScriptTimeout),TimeSpan.Zero);处理完之后把这个Key从Cache中Remove掉Cache.Remove(key);后续的提交的Form如果发现Cache中有这个Key就放弃处理if  ( key == null || Cache.Get(key) == null ); 这个Key可以每次生成Form的时候动态注册到Form中Page.RegisterHiddenField("myID",Guid.NewGuid().ToString());Page.Trace.Write("New ID",newID); 注: 没有办法用Form的submit事件,因为submit事件只有通过input text=submit才能触发。       参考: OneClick Control...[阅读全文]

posted @ | Feedback (4) |

摘要:Developing Microsoft ASP.NET Server Controls and Components Part 1 :Component Programming Overview   Name Space   Syntax   C#: Namespace {}   VB: Namespace End Namespace   Naming Guidelines   Prefixing namespace names with a company name or other well-established brand Use a stable, recognized technology name at the second level of a hierarchical name. Pascal case Use plural namespace names if it is semantically appropriate. Do not use the same name for a namespace and a class.   Examples   Design Guidelines   Class   Syntax   C#: class identifier [: base-list] { class-body }[;]   VB: Class name    [ Inherits classname ]    [ Implements interfacenames ]    [ statements ] End Class   Naming Guidelines   Use a noun or noun phrase to......[阅读全文]

posted @ | Feedback (1) |

摘要:Creating a Pageable, Sortable DataGrid By Scott Mitchell 属性 SortExpression:列的排序表达式(不一定与DataField不一定相同)。当AutoGenerateColumns属性为True时,DataGrid每一列的SortExpressionoperty被自动设为绑定到该行的Data Field,如果AutoGenerateColumns为False,需要手工设置。 事件 SortCommand:一般的情况下为Click排序列的Head时触发,参数为DataGridSortCommandEventArgs e,在SortCommand事件里可以将排序后的DataSource重新绑定到DataGrid上。 定制 可以在ItemCreated事件里对排序列的Head进行定制,比如,若e.Item.ItemType=ListItemType.Header,可以在Head后面添加表示排序方向的箭头 string strSortBy  = (string) ViewState["SortExpression"];string strSortAscending  = (string) ViewState["SortAscdening"];string strOrder = ("yes" == strSortAscending ? "5" : "6");Label Lbl_Sorted  = new Label();Lbl_Sorted.Font.Name = "webdings";Lbl_Sorted.Font.Size = FontUnit.XSmall;Lbl_Sorted.Text = " " + strOrder;e.Item.Cells[i].Controls.Add(Lbl_Sorted); 可以将排序的相关状态存储在ViewState中 注:对分页以及多列排序需要特别注意。...[阅读全文]

posted @ | Feedback (1) |

摘要:1: 相对路径路径丢失 比如:<LINK href="css\ie6.css" type=text/css rel=stylesheet>,当叶面提交过后,相对路径丢失 2: Script失效 比如:<INPUT id=Button1 type=button value=Button name=Button1 runat="server"> <SCRIPT language=vbscript id=clientEventHandlersVBS> <!--     Sub Button1_onclick         msgbox "a"     End Sub --></SCRIPT>  private void Button1_ServerClick(object sender, System.EventArgs e)  {   Response.Write ("Click");  } 当叶面提交过后,Client端的Script:Button1_onclick失效...[阅读全文]

posted @ | Feedback (3) |