XSS

各种IDE之间的区别

假设IDE是Car shops的老板,用户是buyer

 

Visual Studio车行:

只有一种型号,不过用户可以自己定制它的外表,包括颜色,样式,甚至车内的挂饰等等。利用定制功能用户可以很轻松DIY出华丽的外表。同时车内配备了最先进的导航仪,防止用户出错。只是,你需要依次按下车内的15个开关才能打开车前盖;即使打开了车前盖,发动机也是锁死的,没法更改,没法替换

 

Eclipse车行:

这里的车是免费的。但它不提供整车的组装服务,用户必须自己装。好处是用户可以定制每一个零件的型号,坏处是麻烦。Eclipse甚至不能帮你给车涂漆,他只是扔给你一桶你喜欢的油漆,然后让你自己涂。作为替代,它提供给用户一组电话号码,其中包括了涂漆服务的电话,组装服务的电话,等等。觉得麻烦可以随时call那些服务,只不过很多服务都是要收费的。当然,你也可以自己开一家服务公司来赚外快。和Visual Studio一样,Eclipse内部配备了先进的导航仪。

 

TextEditor车行:

用户很惊讶的发现,这里根本不卖车。这里只是提供给你一堆螺丝钉,铁片,油漆等等造车的原料,以及一份很简短的造车指南。所有的一切都必须用户自己动手。导航仪?如果你真的想要的话可以自己造一个。

坦白说跟上面2者相比没有任何优势,但据说有一个叫程序员的物种很喜欢它,因为他们很喜欢上帝创造万物的感觉。

Computer Security课堂笔记

lbr :此程序已弃置不用。lbr的作用是打印文件,它的工作方式是在文件夹下生成随机文件名的image文件,向其中写入数据,然后打印它。该程序具有SUID权限。由于计算机的随机算法都是伪随机,当进行了大量打印之后,文件名有很大概率会重复。所以,我们可以预测将要出现的文件名,建立一个同名的,指向重要系统文件的符号链接,这样该系统文件中的内容将会被覆盖。

 

LD_LIBRARY_PATH LD_PRELOAD :都是用来影响动态链接库的环境变量,由于修改此变量后将可以覆盖库函数,never use it。在SUID程序中这2个变量自动禁用

 

system调用 :Use execXX instead. system调用的机制是启动一个shell,然后将参数传递给shell。参数并非只能是一条指令。说白了,用户可以在参数里面随便乱写。  而exec调用限定了后面的参数只能作为某个程序的参数,而不能是另外的程序。

 

sendmail :心惊胆寒啊,我在公司里实习的时候亲手写过sendmail程序。sendmail的漏洞是,对于本地邮件文件,程序会检查其owner,发现其owner不是邮件所有人之后就会强制改变其owner,所以攻击者只要偷偷放一个与邮件文件同名的suid程序到目录下,然后发一封邮件,程序就变成对方的了

 

chsh :chsh会往passwd文件中写入信息,如果你在输入中加入换行,就可以覆盖passwd文件中的重要信息。现在chsh会检查输入,所以此漏洞已经修复

随机数算法

本文参考more programming pearls的相关章节,表说我抄袭……

假设你有一个随机函数RandInt(L,U),如何产生1..N中的M个不重复的随机数?

正常人想到的算法是类似这样的:

//initialize set s to empty
int size = 0;
while (size < M) {
    int t = RandInt(1,N);
    if (t not in s){
        s.insert(t);
        size=size+1;
    }
}

但是这个算法有一个致命缺陷,当M值与N值很接近时,在获得最后几个随机数时它需要猜测太多次以至于这将严重降低程序的运行速度,对于特定的随机数列,它甚至不会停止。那么,有没有一种只需要运行M次RandInt函数即可获得M个不重复随机数的算法呢?有的。Floyd大神给出了他的答案:

int sample(int M, int N){
    if (M=0) return new Set();
    else{
        Set s=sample(M-1,N-1);
        int t=RandInt(1,N);
        if(t not in s) s.insert(t);
        else s.insert(N);
        return s;        
    }
}

这个算法为了从1..N中产生M个随机数,先从1..N-1中产生M-1个随机数,然后加上N去产生第M个随机数。很神奇吧?