第十节 25Web开发原则

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input type="button" value="删除" onclick="return confirm('确定要删除吗');" />

        <asp:Button ID="Button1" runat="server" Text="服务端的alert" 
            onclick="Button1_Click"/>
        <br />
        <br />
        <asp:Button ID="Button2" runat="server" onclick="Button2_Click" 
            Text="Message" />
        <br />
        <br />
        <asp:Button ID="Button3" runat="server" onclick="Button3_Click" Text="中木马" />
        <br />
        <br />
        <br />
        <asp:Button ID="Button4" runat="server" onclick="Button4_Click" Text="Button" />
        <asp:Label ID="Label1" runat="server" Text="0"></asp:Label>
    </div>
    </form>
</body>
</html>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

//using System.Windows.Forms;

/* web开发的一些基本原则
 * 最小权限原则,只允许用户做....,而不是"不允许用户做....."
 * 
 * 浏览器查看的是服务端代码的执行输出的文本,除非服务器有漏洞,否则浏览者无法查看服务端的aspx,cs代码
 * 目标另存为也是保存的aspx的执行结果,而看不到aspx的原代码
 * js html是被输出到浏览器上执行的,因此无法禁止浏者查看js, html
 * 
 * C#代码是运行在服务器端的,js代码是运行在浏览器客户端的
 * 
 * 能在浏览器完成的事情,就不要到服务端去做
 * 客户端是不可信的
 * 
 *原则1:
 *   案例1: 在项目中添对System.Widnows.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.WriteText("c:/muma.exe","木马木马木马木马木马");
 *   
 * 
 *   用CassiniDev.exe启动测试程序让学生们远程琐(VS内置的服务器不能远程访问).exe生成到了服务器的磁盘中,而不是访问者的磁盘中
 *   因为C#代码是运行在服务器中的,而不是在浏览器中的,浏览器得到的只有返回html内容
 *   
 *   案例3: 两个学生别访问点南自增1的界面,互不影响,因为不同用户变量内容是隔离的
 *   
 * 
 * 
 * 原则2:
 *    能在浏览器端完成的事情,就不要到服务端去做
 *    按钮隐藏一个控件就不要写服务端代码,在客户端用javascript,dom来操作就可以,比如要操作数据库,显示是在浏览器端做不到的
 *    这时候就要写服务端代码,校验用户名,密码这样的操作可以放到浏览端(用户名,密码是写死的),技术上可以,但是这样安全性太差,因为必须放到服务端
 * 
 * 不要把敏感数据,算法写在浏览器端
 * $("#btnLogin").click(function(){
 *    if($("#username").val() == "admin" && $("#password").val() == "123456")
 *    {
 *       alert("登录成功");   
 *    }else{
 *       alert("登录失败");
 *    }
 * });
 * 
 * 用户在浏览器中查看源代码就可以看到用户名,密码是什么,在动态网站空间还是很稀有的那个年代,很多个人主页都这用这方式进行数据的"保密"
 * 
 * 不要把机密信息隐藏在于html中
 * 只有密码输对了才显示下载地址,实现代码见备注
 * 
 * 应该在服务端控制驿不对则Visible=false,服务端控件的HyperLink1.Visible=false是根本不输出到客户端
 * 在和jquery等结合的时候是无法用$("#id").show()来显示的,visible=false的控件,因为控件根本没有渲染到HTML中
 * 
 * 应该是在机密页面打开之前做权限校验,而不是在一个页面中做校验,如果正确就倒向机密页面,不正确就不导向
 * 
 * 
 * XSS漏洞
 * 
 * 不要轻信用户提交上来的数据
 * 
 * alert消息太难看了,因此开发一个ashx页面用来统一展示消息,showMessage.ashx
 * 
 * 
 * aspx中默认对请求的数据进行了校验,如果数据中有< /等有潜在XSS攻击的字符,则会报错,对于一些CMS系统等确实需要提交html内容的地方要关闭它
 * 在页面机部的page中加入ValidateRequest='false'这个属性
 * 
 * 在显示的进修如果需要对内容在显示之前进行HTMLEncode,除了可以使用户HttpUtility.HtmlEncode进行手动编码的话,还可以使用Literal控件显示,
 * 如果修改Literal的model属性为Encode那么就会自动进行HTMLEncode然后显示
 */
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(HttpUtility.HtmlEncode("<a href=''>哈哈</a>"));
        //HttpUtility.HtmlEncode(s); 将字符串中的< > 等特殊字段转换为>等转义符

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        //这里直接出现alert
        Response.Write("<script type='text/javascript'>alert('你确定要删除吗?');</script>");
        //Response.Write("xxdxd");
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        //这里不能弹出,好像是少引用文件了
        //MessageBox.Show("多简单啊,服务端弹出对话框");
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        File.WriteAllText("c:/muma.exe", ",木马(){木马木马木马木马木马}");

    }
    protected void Button4_Click(object sender, EventArgs e)
    {
        string i = Label1.Text;
        int v = Convert.ToInt32(i) + 1;
        Label1.Text = v.ToString();
    }
}

  

posted @ 2012-03-19 00:01  简单--生活  阅读(297)  评论(0)    收藏  举报
简单--生活(CSDN)