web开发的一些基本原则:
1. C#代码是运行在服务器端的,Js代码是运行在浏览器客户端的。
2. 按钮确认提交的实现在Button的OnClient中写。例如:
<input type=”submit” name=”delete” value=”删除” οnclick=”return confirm(‘真的要删除吗?’)”/>
代码是运行在浏览器端的,和服务器没有关系。
3. 在服务器端弹出消息窗口:
context.Response.Write(“<script type=’text/javascript’>alert(‘删除成功’)</script>”);
并不是真的在服务器端运行,只是生成了JavaScript代码到浏览器端,浏览器会在解析文档的时候运行alert,不推荐使用这种写法。对于服务器端的代码来说,生成一堆HTML代码就是一堆字符串,没有任何意义,只有到了浏览器端执行才有意义。
案例1:在项目中添加对System.Window.Forms的引用,然后MessageBox.Show(“Hello”),用CassiniDev.exe启动测试程序让学生们远程测试。证明C#代码是运行在服务器端的。
127.0.0.1是回环地址(LoopBack),就是表示通过回环地址访问本机,哪怕是本机,localhost就是127.0.0.1的别名,是无法在外部访问。
0.0.0.0任意IP(Any Ip),不用写死绑定的IP了,通过任何一段网卡都可以访问网络程序。
案例2:伟大的ASP.NET,可以在访问者中创建木马文件
File.WriteAllText(“c:/muma.exe”,”木马(){葵花点穴手();降龙十八掌();熊猫烧香();}”);
.exe生成到了服务器的磁盘中,而不是访问者的磁盘中,因为c#代码是运行在服务器中的,而不是浏览器中的,浏览器得到的只有返回的HTML内容。
案例3:两个学生分别访问点击自增1的界面,互不影响,因为不同用户的变量内容是隔离的。
4.能在浏览器端完成的事情,就不要到服务器端去做。
5. 按钮隐藏一个控件就不要写服务器端代码,在客户端用JavaScript、dom来操作就可以。比如要操作数据库,显然是在浏览器端做不到的,这时候就要写服务器端代码。校验用户名,密码这样的操作可以放到浏览器端(用户名,密码是写死的),技术上可以,但是这样安全性太差,因此必须放到服务器端。
客户端验证不能代替服务器端验证
设置取款金额不能高于100元
客户端:
<form=id=”form1”runat=”server” οnsubmit=”if(parseint(document.getElementByIdx_x(‘TextBox1’).value,10)>100){alert(‘最多只能提款100元’);return false;}”>
服务器端:Label1.Text=”取款成功,金额:”+TextBox1.Text;
如果稍微懂点电脑知识的人禁用javascript(Internet选项—安全—自定义级别—脚本---活动脚本-----禁用)那么客户端javascript校验就被禁用了,就可以取款多余100元了
客户端校验是为了很好的客户端体验,服务器端校验是最后一次把关,防止恶意请求。
注意:.aspx中的button为服务端按钮,不是客户端的,所以onclick是触发服务器端的事件,而onclientclick才是最终生成到客户端浏览器中的onclick代码。
6. 不要把机密信息隐藏到html中,很容易导致信息的泄漏
例如:
只有密码对了才显示下载地址:
应该在服务端控制密码,不对则Visible=”False”,服务器端控件的HyperLink1.Visible=false是根本不输出到客户端。在和JQuery等结合的时候是无法用$(“#控件id”).show()来显示Visibel=False的控件,因为控件根本没有渲染到HTML中。
应该是在机密页码打开之前做权限校验,而不是在一个页面中做校验,如果正确就倒向机密页面,不正确就不倒向。
7. XSS漏洞:不要轻信用户提交上来的数据
alert消息太难看,因此开发一个ashx页面用来统一展示消息。系统内部需要弹出消息的时候只要将用户Redirect到ShowMessage.ashx?Msg=消息就可以,比如:Response.Redirect(“showMessage.ashx?Msg=用户名不能为空!”)
利用漏洞可以制作送奖品的消息框。也可以收集帐号,密码
aspx中默认对请求的数据进行了校验,如果数据中有<,/等有潜在XSS攻击字符,就会报错,对于一些CMS系统等确实需要提交HTML内容的地方要关闭它,在页面顶部的Page中加入ValidateRequest=”false”这个属性。
在显示的时候如果需要对内容在显示之前进行HTMLEncode,除了可以使用HttpUtility.HtmlEncode进行手动编码的话,还可以用Literal控件显示,如果修改Literal的Mode属性为Encode,那么就会自动进行HtmlEncode然后显示。
用户发帖时也存在XSS的问题,例如:将发帖内容保存到一个文本文件中,不用数据库,降低文本复杂度
我们可以对请求的数据做检测,如果请求数据中有<等就认为是恶意请求,禁止提交。aspx默认就是采用这种策略,缺点是如果做的是一个程序员论坛,程序员就没有办法发HTML的帖子了,因此更好的处理策略是将用户发表的内容按照鸳鸯显示出来,而不是以HTML的方式显示出来,使用HttpUtility.HtmlEncode就可以将字符窜的<,/等特殊字符转换为HTML显示的字符,也就是不把<script>当成定义脚本的标签,而是当成<,script>,这样可以在页面上直接显示出来的内容。