除非明确允许,否则就禁止!

这是从《编写安全的代码》一书中学习到的第一个有启发性的例子。此文的大部分内容来自此书。

且看如下代码:

DWORD dwRet = IsAccessAllowed(…);

if (dwRet == ERROR_ACCESS_DENIED)

{

    //检查失效,禁止操作

}

else

{

    //允许操作

}

这个代码乍一看貌似没什么错误,但是我们设想一下,如果IsAccessAllowed函数(方法)返回的如果不是检查失败信息,而是类似于内存耗尽等其他错误信息,那么用户将会被允许操作,这是一件多么可怕的事情啊!

解决此问题的方法其实很简单,就是一句话“除非明确允许,否则就禁止”,请看下面的修正代码:

DWORD dwRet = IsAccessAllowed(…);

if (dwRet == NO_ERROR)

{

    //允许操作

}

else

{

    //检查失效,禁止操作

}

这一句话适应于很多场合,例如防火墙的规则设置,过滤用户的输入等等。但是,有一个地方遵循的正与这句话相反,那就是法律——除非明确禁止,否则都是合法的。

我终于确定了自己的发展方向

选择往往是很难的一件事情。大家都说之所以迷茫,是因为选项太多。面对众多的路,选择其中一条并用一生来行走并非易事。

最近我迷茫了,正像刚上大一的时候一样迷茫,不知自己将来要走向哪。想起明确自己的方向是因为如果继续在老路走下去,必将成为机器,这不是我想要的生活。我想要的生活是富有挑战性的,有新鲜感的,所以我要转变!

最终,我确定了我的发展方向——计算机安全。之所以涉足这个领域,源自于最初接触电脑的动机。那是十多年前的事情了,我想现在大多数新手一样崇拜黑客,妄想有朝一日可以干点什么。我还清楚的记得当时上网搜索了一下黑客应该如何入门,得到的答案是先学编程,于是进而搜索编程如何入门,得到的答案是学VB,于是,VB成了我学的第一个编程语言。

学习了VB,然后我就一头扎入到了程序设计领域不可自拔直至今日,期间确实忘记了最初为什么要学习编程。等到终于有一天得以审视自己走过的路的时候,才发现,自己的内心深处并没有抛弃最初的目标。既然重新浮出水面,那么就努力为之奋斗吧!

用先序遍历串构造树

题目要求:根据树的先序遍历字符串,构造一棵二叉树,并输出其中序遍历字符串。

代码如下

#include <stdio.h>
#include <malloc.h>
struct Node
{
    int data;
    struct Node *LC,*RC;
};    //树节点的结构体

int i=0;   //初始化字符串指针
char ch[20];  //定义字符串

void MakeTree(struct Node **T);  //生成树
void BianLi(struct Node *T);  //遍历树

int main ()
{
    struct Node *MyTree;  //头节点指针
    gets(ch);
    MakeTree(&MyTree);
    BianLi(MyTree);
    getch();
}

void MakeTree (struct Node **T)
{
    struct Node *t;
    if (ch[i]==’0′ || !ch[i])
    {//判断边界条件
        (*T)=NULL;
        i++;
        return;
    }
    (*T)=(struct Node *)malloc(sizeof(struct Node));  //建立根节点
    (*T)->data=ch[i]-’0′;
    i++;  //指针后移
    MakeTree(&((*T)->LC));  //构造左子树
    MakeTree(&((*T)->RC));  //构造右子树
}

void BianLi (struct Node *T)
{
    if (!T)
        return;
    BianLi(T->LC);  //遍历左子树
    printf(“%d”,T->data);  //访问根节点
    BianLi(T->RC);  //遍历右子树
}

经过这个题目,偶更深刻的理解了树的递归定义:树是n(n>=0)个结点的有限集,在任意一棵非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互补相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树。

标签:

不使用判断语句及操作符,实现判断两个整型数的大小

这个题目主要使用位运算的知识来解答,曾经是一个公司的面试题。

代码如下:
#include
int main ()
{
    int a,b;
    int R[2]={'<','>'};
    int result;
    printf("Please input two number:");
    scanf("%d%d",&a,&b);
    result=(a-b)>>(sizeof(int)*8-1);
    printf("The result is:a %c b",R[result+1]);
    getch();
    return 0;
}

需要注意的如下:

  1. 实现原理:a-b,结果为正则a>b,为负则a<b,而整数在内存中存储的最高位为符号位,这样,左移整数在内存中所占位数-1,即可间接判断出结果。
  2. sizeof(int)*8的意思为int型整数所占内存空间的大小,单位是位,这样算增强了可移植性。
  3. 输出答案的方法,除了用判断可以输出不同的结果外,数组也可以实现相似功能。
标签:

Windows XP pro局域网互访快速解决方案

前几天为了使用VSS配置局域网,搞了整个晚上没有成功,原因竟是IP地址不在同一网段,因此做此备忘。

1、确认IP属于同一网段
2、确认工作组相同
3、控制面板->管理工具->本地安全策略->选择“本地策略”中的“安全选项”->设置“网络访问:本地帐户的共享和安全模式”的属性为“经典-本地用户以自己的身份验证”
4、正确设置防火墙,包括windows防火墙

以上步骤在Windows xp pro版本中测试通过,经过以上步骤,可以快速实现局域网互访。

标签:

欢迎欢迎~!

大家好!欢迎光临寒舍!