Asp.net-夜话学习三
时间:2011-02-28 来源:vice
HTML表单的提交方式:
它有两个重要的属性:action和method。
action属性指明当前表单提交之后由哪个程序来处理,这个处理程序可以是任何动态网页或者servlet或者CGI(Common Gateway Interface),在asp.net里面一般都是都aspx页面来处理。
method属性指明form表单的提交方式。它有两个可能值get和post。
(1)get方式提交的表单在地址栏会显示参数名和参数值,而post方式不会。
用post提交参数相对来说更隐蔽一些,也相对安全一些。假如我们这个页面用于用户登录并且存放用户信息的表为“users”,我们的sql语句可能会这么写:string sql=” select * from users where username='”+username+”’ and password='”+password+”’”;然后我们的username和password变量从表单提交的数据获取,正常情况下用户填写是没有问题,就上面的例子来说用户填写的用户名和密码分别是“zhoufoxcn”和“123456”,那么我们最后得到的SQL语句是:sql=”select * from users where username=’zhoufoxcn’ and password=’123456’”,这样是没有问题的。如果用get方式提交,用户可以对上面的参数进行一些改动,比如在地址栏直接输入:http://localhost/GetUserInfo.aspx?username=zhoufoxcn&pwd=123';delete * from users',那么我们得到的SQL就是:string sql=” select * from users where username='zhoufoxcn' and password='123';delete * from users'”,执行上面的SQL语句就能把Users这个表里的所有数据删除掉!这个一个触目惊心的危险!这个就叫SQL注入。
(2)由于浏览器地址栏能输入的最大字符数有限制,所以用get方式提交不能处理参数值更大的表单,而post方式则没有这个限制。
HTM控件
获取HTML表单内容
获取方式 | 表单提交方式 |
Request.QueryString["控件名"] | 适合于get方式提交的表单 |
Request.Form["控件名"] | 适合于post方式提交的表单 |
Request["控件名"] | 同时适合于get和post方式提交的表单 |
乱码问题
之所以出现乱码就是因为在这里客服端请求的编码和服务器响应的编码不一致.
默认情况下Request的ContentEncoding为UTF8Encoding,而Response的ContentEncoding为System.Text.DBCSCodePageEncoding,二者的不一致导致了输入中文成了乱码。
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="utf-8" %>
Gbk是在gb2312的基础上扩展的,大概能显示1万8千多个汉字,这对于一般古文献也差不多够了。Unicode则更大一些,它能显示20901个汉字(范围是从\u4e00到\u9fa5),并且还能显示日文、韩文、台湾文字、香港文字和新加坡等文字,所以目前很多网站都采用unicode编码。Utf8编码就是unicode编码中的一种.
UTF8>GBK>GB2312
SQL注入
服务器端表单
<form id="form1" runat="server">
在服务器端表单里可以不用指定action属性,表示由当前页面处理,也可以不指定method属性,默认为post方式提交表单。
HTML服务器控件
HTML服务器控件与普通服务器控件不同的是:在普通HTML控件中加上了一个id属性和一个runat=”server”标记。如下就是一个HTML服务器控件:
<input type="text" runat="server" id="txtUserName" />
HTML服务器控件有几个限制:
在整个asp.net页面中这个控件id的必须唯一,并且HTML服务器控件只能放在HTML服务器表单中。因为一个asp.net页面只能有一个服务器表单,所以说在服务器表单中控件的id值必须唯一,因为我们在编程的时候通过这个id来访问HTML服务器控件。
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNTQ0MjI5MTUzZGR1mFZ52ODFgAKe7Qx9/67qMGFJCA==" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBAKIpeT6DgKl1bKzCQK1qbSRCwLdkpmPAcJ7Zy/C66ypRIq49nr3hQNayqwk" />
因为服务器会保存服务器控件的状态和属性,所以它会利用一些隐藏域来保存这方面的信息,这部分的内容是经过Base64编码的。