分享
 
 
 

Web编程防黑,遵循特定的web安全规范

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

web站点不可避免提供了很多同用户交互的内容,在编写程序过程中,应特别注意用户输入内容的处理,以及对数据库的一些操作。阐述本文的目的,在于提醒开发者遵循特定的web编程安全规范,以尽量避免应用程序代码的安全问题。

对用户输入内容的处理遵循三步骤的原则:

1. 检查输入数据是否来自期望的上一级页面,具体可采用“同步令牌”等技术实现;

2. 检查输入的提交方法是否为post方法;

3. 检查用户输入数据是否有效合理;

通过以上三步骤,即可基本防止别有用心者通过精心构造一些字符串来对系统进行攻击。

一、 处理用户登录

用户登录程序主要是需要对用户输入的用户名及口令仔细进行有效性校验,否则攻击者可以提交一些特殊数据,如果程序不能过滤掉这些特殊字符,则可能导致危险后果。

1. 对于口令验证过程,建议采用下列方式

<1根据提交的用户名在数据库中查找记录,如果没有则出错返回,如果有该用户,转步骤<2;

<2将得到的记录中的口令部分与用户输入的口令进行字符串比较,如果一致则允许通过,否则出错返回;

注意:不要在一条select语句中同时完成对用户/口令的验证,以增加潜在的危险攻击的难度;

2. 用单引号“封装”用户输入数据

对于php语言写的代码,应该在所有由用户输入的数据外面封装上单引号,不管是数值型变量还是字符型变量。构造sql语句是最好采用下列格式:

$sql_query=”select f1,f2 from table where id=’input_id’ and name=’input_name’”;

这样,用户输入数据中如果包含单引号等特殊字符,php会自动在其前面增加’\’来取消掉其特殊意义,从而大大降低了安全风险。

同样,对于j ava语言代码,在所有可能的情况下,应该使用preparedstatement和动态sql,即用?符号代表参数,通过preparedstatement的setxxx(如setint, setstring等)方法设置参数,然后执行sql语句,不要养成在每次语句执行前根据参数拼sql语句的习惯。

二、 处理用户输入

除了对登录的处理,在处理用户输入时,还需遵循以下原则:

1. 拒绝任何以斜线开始的内容

斜线意味着“相对于根”或绝对路径。用户很少需要访问web根目录之外的数据,这样他们使用的路径就是相对于web根目录,而不是绝对路径,为安全起见,有必要拒绝任何以斜线开始的内容;

2. 拒绝任何包含单个点(.)和两个点(..)的序列的内容

在路径中单个点(.)和两个点(..)的序列有特殊含义。单点意味着“相对于当前目录”,而双点意味着“相对于当前目录的父目录”。有些人可以建立象../../../etc/passwd这样的串逆向三层,然后向下进入/etc/passwd文件,从而对系统安全造成极大威胁;

3. 在把用户提交的数据传送给系统之前,过滤掉如下字符:

; | < * & ! # ( ) { } [ ] : ‘ “ /

此外,还要注意对回车换行符号做过滤处理;

4. 拒绝任何以冒号为第二个字符的内容

基于nt服务器使用驱动器字母的概念来引用磁盘卷,包含对驱动器的引用的路径都以一个字母加上一个冒号开头;

5. 应拒绝任何unc路径

基于nt的服务器还支持universal naming conventions(unc)引用,一个unc文件规格指定机器名和一个共享点,其余部分和指定机器上的指定共享点有关。unc文件规格总是以两个反斜线开头,编写程序时应加以注意。

6. 仔细检查输入语句,一遍情况拒绝如下命令:

rm ?f

mail ……

delete ……

…… /etc/passwd

或其它对系统有威胁的操作。

7. 存储/删除密码

如果密码是存储在 j ava string 对象中的,则直到对它进行垃圾收集或进程终止之前,密码会一直驻留在内存中。即使进行了垃圾收集,它仍会存在于空闲内存堆中,直到重用该内存空间为止。密码 string 在内存中驻留得越久,遭到窃听的危险性就越大。

更糟的是,如果实际内存减少,则操作系统会将这个密码 string 换页调度到磁盘的交换空间,因此容易遭受磁盘块窃听攻击。

为了将这种泄密的可能性降至最低(但不是消除),您应该将密码存储在 char 数组中,并在使用后对其置零。(string 是不可变的,所以无法对其置零。)

8. j ava编程的智能序列化

当为存储器或传输任何私有字段而序列化对象时,缺省情况下,这些对象都呈现在流中。因此,敏感数据很容易被窃听。可以使用 transient 关键字来标记属性,这样在流中将忽略该属性。

三、 处理数值型变量

所有用户输入有关变量都要用单引号包起来(php语言)。

对所有数值型变量,首先要判断其内容是不是真的数值型(例如可以用is_num()函数),如果不是,就进行出错处理。为了安全起见,即使是数值型变量,也应当在它的外面包上单引号。

四、 处理出错信息

程序员写程序时,往往设定输出一些出错信息,或者借助系统的出错信息对程序进行调试。在实际应用中,一定要注意替换这些出错提示信息,以免泄露一些重要的信息给恶意攻击者。特别时在程序测试阶段,一定要注意用户输入错误数据后程序的运行结果及报错信息等。

五、 危险的系统调用

尽量减少system()、popen()之类的系统调用,特别是这些调用如果要激活一个系统shell时,更应该仔细检查其安全性,以免被黑客利用。

如果不是特别需要,不要使用system()或者popen()这样的系统调用,特别是以用户输入的数据作为这些调用的参数的时候。如果没有对用户输入数据进行分析处理,可能会被用来执行系统命令。如果必须使用这些调用,应当过滤掉用户输入数据中存在的危险字符: ; & | < 等等。

或者,可以通过一个或多个参数,在不激活一个shell的前提下执行一些命令,达到程序要完成的目的,如用perl写的如下代码是安全的:

system(‘/usr/games/fortune’,’-o’);

也可以用open达到和popon相视的效果,但不用激活shell:

open(fh,’|-’)||exec(“program”,$arg1,$arg2);

或者用下面的代码不接受不安全的数据信息,避免被攻击:

unless($recipient=/^[\w@\.\-]+$/)

{

#print out some html here indicating failure

exit(1);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有