老婆使用说明书——注册系统的逻辑与结构 (转载 )
【品名】妻子
【俗称】媳妇儿
【通用名】老婆
【英文名】wife
【化学名称】已婚女性
【成分】水、蛋白质、脂肪、核糖核酸、碳水化合物以及少量矿物质,气味幽香。
【理化性质】酸性;可分为一价(嫁)、二价(嫁)、三价(嫁)……n价(嫁)。易溶于密语、甜言;遇钻石、名车、豪宅熔点降低,难溶于白丁。
【性状】本品为可乐状凹凸异性片,表面光洁,涂有各种化妆品、对钻石、铂金有强烈的亲和力;害羞时泛红,生气时泛绿,随时间推移表面会出现黄斑,起皱,但不影响继续使用。
【功能主治】主治单身恐惧症,对失恋者和相思病有明显效果,亦可用于烧淘洗买、带孩子。
【副作用】气管炎、耳根软、视疲劳、行为受阻等。严重不良反应者,可致皮肉损伤。
【用法用量】一生一片。
【禁忌症】公开服用两片或两片以上
【注意事项】
1、肾功能不全者慎用
2、请控制每日用量,如身体出现不适应症状应适当控制频次;
3、服用本品时如同时服用其他药品请咨询生产企业,否则后果自负;
【规格】几十千克志几百千克,片重超标不影响使用,一般以45kg为最佳。
【贮藏】常温下保存。避免与成年女性、单独帅哥相处。严禁在外过夜,应放到男人不易接触到的位置保存。
【包装】各种时装、鞋帽、首饰、手袋,随季节变化更换。
【有效期】终生有效。
【批准文号】见钻石购买发票号码
【生产日期】同身份证出生年月日
【生产企业】岳父岳母(仅针对于岳父岳母作风正派)。
本产品质量三包,如出现质量问题请与当地民政局联系。
这是网上非常热的一个博文,我想,作者这家伙,一定是个编程天才,如果不学编程,那是相当的可惜了…
前面注册的代码,很多网友看后都生气了,后果很严重,都急吼吼地要来Sql注入了。
很多小盆友,包括本大人,N小时前,也不知道还有注入一说,现在,本大人现学现卖,科普一下吧,讲最简单的,你在用户名文本框中输入1' or '1'='1 ,密码随意,所谓的登录系统,就形同虚设……
解决这个问题的方法有很多,其中,一个重要的方法,就是参数化查询。
参数化查询就是在访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter类) 来给值。在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。
Parameter这么厉害?想不想讨来做老婆?帮你看看家门,河东狮吼,吓退十万注入客??
还是让我们先附庸风雅,写一个SqlParameter使用说明书吧:
【家住何方(程序集名称)】system.data.dll
【姓甚(命名空间)】System.Data.SqlClient
【名谁(名称)】SqlParameter
【祖父母】System.Object
【父母】System.MarshalByRefObject
【主要功能】可单独或做成数组,存放、传递SqlCommand的参数或参数组,当然是防止骇客Sql注入
【主要缺点】不能生育,无法继承此类
【备注】参数名称不区分大小写
【生产日期】new的那一刻
【有效期】招之即来,挥之即去,用完自动消失
【使用方法】参考下面示例程序
protected void btnRegist_Click( object sender, EventArgs e) { string strConnection = ConfigurationManager.ConnectionStrings[ "NetShopConnString" ].ConnectionString; string cmdText = "INSERT INTO Users(Username,Password,Name,Sex,Age,Phone,Email,QQ) values(@Username,@Password,@Name,@Sex,@Age,@Phone,@Email,@QQ)" ; string username = txtUserName.Text; string password = txtPassword.Text; string name = txtName.Text; string sex = radlSex.SelectedValue; int age = int .Parse(txtAge.Text); string phone = txtPhone.Text; string email = txtEmail.Text; string qq = txtQQ.Text; SqlParameter[] parms ={ new SqlParameter( "@UserName" , SqlDbType.VarChar, 20), new SqlParameter( "@Password" , SqlDbType.VarChar, 20), new SqlParameter( "@Name" , SqlDbType.VarChar, 20), new SqlParameter( "@Sex" , SqlDbType.VarChar, 2), new SqlParameter( "@Age" , SqlDbType.Int), new SqlParameter( "@Phone" , SqlDbType.VarChar, 20), new SqlParameter( "@Email" , SqlDbType.VarChar, 50), new SqlParameter( "@QQ" , SqlDbType.VarChar, 20)}; parms[0].Value = username; parms[1].Value = password; parms[2].Value = name; parms[3].Value = sex; parms[4].Value = age; parms[5].Value = phone; parms[6].Value = email; parms[7].Value = qq; SqlCommand cmd = new SqlCommand(); SqlConnection conn = new SqlConnection(strConnection); try { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = cmdText; foreach (SqlParameter parm in parms) cmd.Parameters.Add(parm); cmd.ExecuteNonQuery(); } catch { Response.Redirect( "ErrorMessage.aspx" ); } finally { conn.Close(); } Response.Redirect( "Login.aspx" ); } |
这段代码,使用逻辑,您熟悉吧?
实现逻辑,就一句话,把注册界面输入的参数接收下来,插入到数据库的表格Users中,然后跳转到登录界面;
除了SqlParameter类,没发现太陌生的面孔吧?
认识、熟悉、掌握和使用一个类,最主要的,就是掌握这个类是干什么的,和怎么使用,而这两点中,类是干什么的,又是最最重要的,当你知道这个类是干什么的时候,怎么使用,往往就是不言而喻了…
声明一点吧:现在这段代码,因为主要是学习最基本的数据库访问技术,所在,在界面上能省即省,没有加验证控件,大家拍砖,别往这儿拍哈……