近来,网络上的SQL Injection 漏洞利用攻击,JS脚本,HTML脚本攻击似乎逾演逾烈。陆续的很多站点都被此类攻击所困扰,并非像主机漏洞那样可以当即修复,来自于WEB的攻击方式使我们在防范或者是修复上都带来了很大的不便。HOOO...... 一个站长最大的痛苦莫过于此。自己的密码如何如何强壮却始终被攻击者得到,但如何才能做到真正意义上的安全呢?第一,别把密码和你的生活联系起来;第二,Supermaster的PWD最好只有你自己知道;第三,绝对要完善好你的网站程序。然而怎样才能完善,这将是我们此文的最终目的。
安全防护,如何做到安全防护?想要防护就要知道对方是如何进行攻击。有很多文章都在写如何攻下某站点,其实其攻击的途径也不过是以下几种:
1. 简单的脚本攻击
此类攻击应该属于无聊捣乱吧。比如****:alert(); </table>等等,由于程序上过滤的不严密,使攻击者既得不到什么可用的,但又使的他可以进行捣乱的目的。以目前很多站点的免费服务,或者是自身站点的程序上也是有过滤不严密的问题。
2. 危险的脚本攻击
这类脚本攻击已经过度到可以窃取管理员或者是其他用户信息的程度上了。比如大家都知道的cookies窃取,利用脚本对客户端进行本地的写操作等等。
3. Sql Injection 漏洞攻击
可以说,这个攻击方式是从动网论坛和BBSXP开始的。利用SQL特殊字符过滤的不严密,而对数据库进行跨表查询的攻击。比如:
http://127.0.0.1/forum/showuser.asp?id=999 and 1=1
http://127.0.0.1/forum/showuser.asp?id=999 and 1=2
http://127.0.0.1/forum/showuser.asp?id=999 and 0<>(select count(*) from admin)
http://127.0.0.1/forum/showuser.asp?id=999'; declare @a sysname set @a='xp_'+'cmdshell' exec @a 'dir c:\'---&aid=9
得到了管理员的密码也就意味着已经控制的整站,虽然不一定能得到主机的权限,但也为这一步做了很大的铺垫。类似的SQL Injection攻击的方式方法很多,对不同的文件过滤不严密所采取的查询方式也不同。所以说想做好一个完整的字符过滤程序不下一凡功夫是不可能的。
4. 远程注入攻击
某站点的所谓的过滤只是在提交表格页上进行简单的JS过滤。对于一般的用户来说,你大可不必防范;对早有预谋的攻击者来说,这样的过滤似乎根本没作用。我们常说的POST攻击就是其中一例。通过远程提交非法的信息以达到攻击目的。
通过上面的攻击方法的介绍,我们大致的了解了攻击者的攻击途径,下面我们就开始重点的介绍,如何有效的防范脚本攻击!
让我们还是从最简单的开始:
防范脚本攻击
JS脚本 和HTML脚本攻击的防范其实很简单:server.HTMLEncode(Str)完事。当然你还不要大叫,怎么可能?你让我把全站类似<%=uid%>都加过滤我还不累死?为了方便的过滤,我们只需要将HTML脚本和JS脚本中的几个关键字符过滤掉就可以了:程序体(1)如下:
以下是过滤函数
- <%
- function CHK(fqyString)
- fqyString = replace(fqyString, ">", ">")
- fqyString = replace(fqyString, "<", "<")
- fqyString = replace(fqyString, "&#", "&")
- fqyString = Replace(fqyString, CHR(32), " ")
- fqyString = Replace(fqyString, CHR(9), " ")
- fqyString = Replace(fqyString, CHR(34), """)
- fqyString = Replace(fqyString, CHR(39), "'")
- fqyString = Replace(fqyString, CHR(13), "")
- fqyString = Replace(fqyString, CHR(10) & CHR(10), "</P><P> ")
- fqyString = Replace(fqyString, CHR(10), "<BR> ")
- CHK = fqyString
- end function
- %>
'以下是应用实例
- <%=CHK(Username)%>
- Username=CHK(replace(request("username"),"'",""))
使用Include把函数写在公有页面上,这样效率是最好的。
程序体(1)
另外,值得我们注意的是,很多站点在用户注册,或者是用户资料修改的页面上也缺少脚本的过滤,或者是只在其中之一进行过滤,注册进入后修改资料仍然可以进行脚本攻击。对用户提交的数据进行检测和过滤,程序体(2) 如下:
- '以下是过滤函数
- If Instr(request("username"),"=")>0 or
- Instr(request("username"),"%")>0 or
- Instr(request("username"),chr(32))>0 or
- Instr(request("username"),"?")>0 or
- Instr(request("username"),"&")>0 or
- Instr(request("username"),";")>0 or
- Instr(request("username"),",")>0 or
- Instr(request("username"),"'")>0 or
- Instr(request("username"),"?")>0 or
- Instr(request("username"),chr(34))>0 or
- Instr(request("username"),chr(9))>0 or
- Instr(request("username"),"")>0 or
- Instr(request("username"),"$")>0 or
- Instr(request("username"),">")>0 or
- Instr(request("username"),"<")>0 or
- Instr(request("username"),"""")>0 then
- response.write "朋友,你的提交用户名含有非法字符,请更改,谢谢合作 <a href='****:window.history.go(-1);'>返回</a>"
- response.end
- end if
程序体(2)
为了提供工作效率我们再将过滤内容程序化,这样对多个参数的过滤效率将有很大程度上的提高:如 程序体(3)
- '以下为程序主体
- dim Bword(18)
- Bword(0)="?"
- Bword(1)=";"
- Bword(2)=">"
- Bword(3)="<"
- Bword(4)="-"
- Bword(5)="'"
- Bword(6)=""""
- Bword(7)="&"
- Bword(8)="%"
- Bword(9)="$"
- Bword(10)="'"
- Bword(11)=":"
- Bword(12)="|"
- Bword(13)="("
- Bword(14)=")"
- Bword(15)="--"
- Bword(16)=" chr(9)"
- Bword(17)=" chr(34)"
- Bword(18)=" chr(32)"
- errc=false
- ‘以下是应用实例部分
- for i= 0 to ubound(Bword)
- if instr(FQYs,Bword(i))<>0 then
- errc=true
- end if
- next
- if errc then
- response.write "<script language=""****"">"
- response.write "parent.alert('很抱歉!您的操作违法了);"
- response.write "history,back();"
- response.write "</script>"
- response.end
- end if
有了上面的过滤函数您可以在任何需要过滤的地方应用过滤函数直接使用就可以了。这就使我们的修复工作大大的简化了。
另外,我想在这里再次多提醒一下,一些站点的UBB在进行小的表情图标转化时也会出现过滤问题,由于很隐蔽所以不容易发现:
如:
我们标签内的文字进行修改,
不知道各位看懂没,前一个单引号用来中和程序提供的左引号,第二个单引号用来中和闭合的右引号,这样程序输出就为:
- <img src='img/0001.gif' onerror=****:alert(); alt=''>
如果图片不存在,那么将激活onerror标签执行脚本程序。对于已经过滤了单引号的站点在这里用双引号一样可以完成。对于过滤了****字段的,只用alert()也完全可以。所以说要过滤就要过滤完全,别给攻击者留下一丝机会。
防范SQL Injection 漏洞攻击
可以这样说,这里似乎是整篇文章的重点了.SQL Injection 漏洞攻击的的多样化也使得我们在程序防护上不得不想的更多一些。面对SQL Injection 的强大"攻势",我们到底该过滤哪些?
一些常用的危险字符有
' 数据库字段判别封闭
-- 某些数据库注释标志
# 某些数据库注释标志
" 可能导致程序出错
\ 跨越目录
3221143836nicode编码的特征字符
$ 可能用于变量标注
/ 和\ 一样
NULL 小心"空"录入的危险,可能导致数据库或系统处理报错,利用报错构造溢出.
空格和'一起,构造sql injeciton
? = & 如果存在二次参数传递,可能改写querystr。
(1) 从最一般的.SQL Injection 漏洞攻击来看:用户名和密码上的过滤问题,如:
提交:用户名为:'or''=' 用户密码为:'or''='
从程序出发,我们完全可以得出,数据库在执行以下操作
Sql=" SELECT * FROM lUsers WHERE Username=''or''='' and Password = ''or''=''"
这样一来,这样,SQL 服务器将返回 lUsers 表格中的所有记录,而 ASP 脚本将会因此而误认为攻击者的输入符合 lUsers 表格中的第一条记录,从而允许攻击者以该用户的名义登入网站。对此类注入的防范似乎简单的很:
利用以下程序就可以实现,程序体(4)
- strUsername = Replace(Request.Form("Username"), "''", "''''")
- strPassword = Replace(Request.Form("Password"), "''", "''''")
程序体(4)
(2)杜绝SQL 注入式攻击的第一步就是采用各种安全手段监控来自 ASP request 对象 (Reques、Request.QueryString、Request.Form、Request.Cookies和 Request.ServerVariables) 的用户输入,以确保 SQL 指令的可靠性。具体的安全手段根据你的 DBMS 而异。
SQL 注入式攻击可能引起的危害取决于该网站的软件环境和配置。当 Web 服务器以操作员(dbo)的身份访问数据库时,利用SQL注入式攻击就可能删除所有表格、创建新表格,等等。当服务器以超级用户 (sa) 的身份访问数据库时,利用SQL注入式攻击就可能控制整个 SQL 服务器;在某些配置下攻击者甚至可以自行创建用户帐号以完全操纵数据库所在的 Windows 服务器。
如:
http://127.0.0.1/forum/showuser.asp?id=999';declare @a sysname set @a='xp_'+ 'cmdshell' exec @a 'dir c:\'--&aid=9
http://127.0.0.1/forum/showuser.asp?id=999'; declare @a sysname set @a='xp'+ '_cm'+'dshell' exec @a 'dir c:\'--&aid=9
甚至可以执行像:net user fqy fqy /add 这样的指令.当然这就需要你当前的运行身份必须是Sa,或者你攻击的只是一台虚拟主机,我劝你还是就此打住.
对于一些整机使用的站点来说防止通过80端口攻击而直接拿到整机管理权限,这一点就变得至关重要了。对xp_cmdshell 的过滤就成为首要,很多站点的程序都是用GET或者是GET与POST混合来提交数据的,对于此,我们给出一种防止GET进行SQL注入的程序:如程序体(5)
- fqys=request.servervariables("query_string")
- dim nothis(18)
- nothis(0)="net user"
- nothis(1)="xp_cmdshell"
- nothis(2)="/add"
- nothis(3)="exec%20master.dbo.xp_cmdshell"
- nothis(4)="net localgroup administrators"
- nothis(5)="select"
- nothis(6)="count"
- nothis(7)="asc"
- nothis(8)="char"
- nothis(9)="mid"
- nothis(10)="'"
- nothis(11)=":"
- nothis(12)=""""
- nothis(13)="insert"
- nothis(14)="delete"
- nothis(15)="drop"
- nothis(16)="truncate"
- nothis(17)="from"
- nothis(18)="%"
- errc=false
- for i= 0 to ubound(nothis)
- if instr(FQYs,nothis(i))<>0 then
- errc=true
- end if
- next
- if errc then
- response.write "<script language=""****"">"
- response.write "parent.alert('很抱歉!你正在试图攻击本服务器或者想取得本服务器最高管理权!将直接转向首页..');"
- response.write "self.location.href='default.asp';"
- response.write "</script>"
- response.end
- end if
程序体(5)
我要做点声明的是:以上的程序只是对GET方式提交的数据进行的过滤,千万不要盲目套用。
像其他一些来自 ASP request 对象 (Reques、Request.QueryString、Request.Form、Request.Cookies和 Request.ServerVariables) 的用户输入的攻击方法的方法,大致都集中在脚本期望的输入变量是数字变量 (ID) 上,当然我们不能只看数字变量,比如:
http://127.0.0.1/systembbs/showtopic.asp?tid=99&name=abc' and left(userpassword,1)='a
http://127.0.0.1/systembbs/addtopic.asp?tid=99&name=abc' and userpassword='or''='
另外,如何单一的防止类似这样的注入错误?
http://127.0.0.1/systembbs/addtopic.asp?tid=99' ;delete forum_forum;--&page=3
- ......addtopic.asp?action=add......
- ......addtopic.asp?action=delect......
- Action1=trim(Request.QueryString())
- if left(action1,7)<>"action=" then '限定querystring必须为 action=
- error(err01)'错误处理
- else
- action=Request.querystring("action")'取得querystring的值
- end if
- select case action'对querystring进行处理
- case "add"
- .....
- case "delete"
- ......
- case else '如果querystring没有这个值则进行错误处理
- error(err02)
- end select
防范程序: 程序体(6)
程序体(6)
出现这样的攻击,使我们的站长们不得不又再次头痛,这里我可以给出大家一个解决最好办法,一般的来说,用户名长度字符数不会超过15个字符,大都为14字符。那么我们从长度出发,来进行过滤:如程序体(7)
- Name=replace(name,"'","")
- If len(name)>16 then
- Response.write " 你要做什么?"
- Response.end
- End if
程序体(7)
为什么我们这里以及过滤了单引号,怎么还要再次取一个长度限制呢?不多说了,看看4ngel的文章先<<饶过'限制继续射入>> .别问我怎么转数字格式,我不会,嘿嘿...^_^!
还继续回到我们的主题," 脚本期望的输入变量是数字变量 (ID)".怎样进行注入防范,天呐,方法太多了,最直接的就是判断是否是数字整型,还有一些比较个性的验证办法,我们一一介绍一下 如:程序体(8)
一,判断数字是否是整型
- p_lngID = CLng(Request("ID"))
二 ,取字长 这一点我相信一般的数据长度不会大于8位所以:
- If len(ID)>8 then
- response.write "bedpost"
- response end
- end if
三,我认为这是一种比较冒险的办法,就是再进行一次数据库的查询,如果数据库表内没有相同的值与之相同那么返回错误.
- sql = "SELECT NAME FROM Category where ID="&ID
- set temp=conn.Execute(SQL)
- if temp.bof or temp.eof then
- response.Redirect("index.asp")
- else
- cat_name=temp("name")
- end if
- set temp=nothing
- '上面的是数据ID 的检测,下面则是正式的查询
- sql = "SELECT ID T_ID, NAME FROM Category where ID="&ID&" ORDER BY xh asc"
- rs.open sql,conn,1,1
四,我自己常用的数据过滤脚本
- id=replace(id,"'","")
- If len( request("id"))>8 then ‘ 为什么取长度上面程序中已经说明
- response.write "<script language=""****"">"
- response.write "parent.alert('老大,你说吧,你想干什么?..');"
- response.write "history.back();"
- response.write "</script>"
- response.end
- else
- If request("id")<>"" then ‘取不为空则是为了防止一些程序页中会出现空值情况,如果不在这里做判断,程序会校验出错.
- If IsNumeric(request("id"))=False then ' response.write "<script language=""****"">"
- response.write "parent.alert('错误的数据编号类型\n\n请返回校验');"
- response.write "history.back();"
- response.write "</script>"
- response.end
- end if
- end if
- end if
程序体(8)
由于我个人的编程习惯,我喜欢将所有的数据检验程序全部保留到整站的公用程序中,比如:conn.asp啦,只需要写一次就可以修复全站的问题.
说到这里,我提一点关于攻击的问题,就是跑用户密码或者是用户名,一般常用的就是
....../show.asp?id=1 and 0<>(select count(*) from admin where id=3 and left(username,1)='a')
这样去一个一个尝试,当然我们不能在这里提什么Perl程序去跑密码,程序是别人写,要自己知道原理.这里我只是想给个比较方便的办法就是取ASC码范围.这个要比单独跑要快很多.不论是是字母,数字,汉字,特殊字符,他们总会有对应的ASC码,用以下办法:
....../show.asp?id=1 and 0<>(select count(*) from admin where id=3 and asc(right(left(username e,3),1)) between 1 and 10000) 剩下的就随你了,一般的从97到122就可以啦,字母嘛,很快D.呵呵,有人想用mid 函数当然也是不错 asc(mid(username,2,1)) between 1 and 10000 也成.
如何更加有效的防止SQL注入攻击?我们将在下面的文章中具体提到!
防范远程注入攻击
这类攻击在以前应该是比较常见的攻击方式,比如POST攻击,攻击者可以随便的改变要提交的数据值已达到攻击目的.又如:COOKIES 的伪造,这一点更值得引起程序编写者或站长的注意,不要使用COOKIES来做为用户验证的方式,否则你和把钥匙留给贼是同一个道理.
比如:
- If trim(Request. cookies ("uname"))="fqy" and Request.cookies("upwd")="fqy#e3i5.com" then
- ........more.........
- End if
我想各位站长或者是喜好写程序的朋友千万别出这类错误,真的是不可饶恕.伪造COOKIES 都多少年了,你还用这样的就不能怪别人跑你的密码.涉及到用户密码或者是用户登陆时,你最好使用session 它才是最安全的.如果要使用COOKIES就在你的COOKIES上多加一个信息,SessionID,它的随机值是64位的,要猜解它,不可能.例:
- if not (rs.BOF or rs.eof) then
- login="true"
- Session("username"&sessionID) = Username
- Session("password"& sessionID) = Password
- 'Response.cookies("username")= Username
- 'Response.cookies("Password")= Password
下面我们来谈谈如何防范远程注入攻击,一般的攻击都是将单表提交文件拖到本地,将Form ACTION="chk.asp" 指向你服务器中处理数据的文件即可.如果你全部的数据过滤都在单表页上,那么恭喜你,你将已经被脚本攻击了.
怎么才能制止这样的远程攻击?好办,请看代码如下: 程序体(9)
- <%
- server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
- server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
- if mid(server_v1,8,len(server_v2))<>server_v2 then
- response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>"
- response.write "<tr><td style=font:9pt Verdana>"
- response.write "你提交的路径有误,禁止从站点外部提交数据请不要乱该参数!"
- response.write "</td></tr></table></center>"
- response.end
- end if
- %>
'个人感觉上面的代码过滤不是很好,有一些外部提交竟然还能堂堂正正的进来,于是再写一个.
'这个是过滤效果很好,建议使用.
- if instr(request.servervariables("http_referer"),"http://"&request.servervariables("host") )<1 then
- response.write "处理 URL 时服务器上出错 "
- response.end
- end if
程序体(9)
本以为这样就万事大吉了,在表格页上加一些限制,比如maxlength啦,等等..但天公就是那么不作美,你越怕什么他越来什么.你别忘了,攻击者可以突破sql注入攻击时输入框长度的限制.写一个SOCKET程序改变HTTP_REFERER?我不会。网上发表了这样一篇文章:
------------len.reg-----------------
- Windows Registry Editor Version 5.00
- [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\扩展(&E)]
- @="C:\Documents and Settings\Administrator\桌面\len.htm"
- "contexts"=dword:00000004
- <script language=vbs>
- set srcevent = external.menuarguments.event
- set doc=external.menuarguments.document
- set ele=doc.elementfrompoint( srcevent.clientx, srcevent.clienty )
- if ele.type ="text" or ele.type="password" then
- ele.maxlength=200
- ele.size=200
- end if
- </script>
用法:先把len.reg导入注册表(注意文件路径)
然后把len.htm拷到注册表中指定的地方.
打开网页,光标放在要改变长度的输入框上点右键,看多了一个叫扩展的选项了吧
单击搞定! 后记:同样的也就可以对付那些限制输入内容的脚本了.
怎么办?我们的限制被饶过了,所有的努力都白费了?不,举起你de键盘,说不。让我们继续回到脚本字符的过滤吧,他们所进行的注入无非就是进行脚本攻击。我们把所有的精力全都用到ACTION以后的页面吧,在chk.asp页中,我们将非法的字符全部过滤掉,结果如何?我们只在前面虚晃一枪,叫他们去改注册表吧,当他们改完才会发现,他们所做的都是那么的徒劳。
程序体(8)
由于我个人的编程习惯,我喜欢将所有的数据检验程序全部保留到整站的公用程序中,比如:conn.asp啦,只需要写一次就可以修复全站的问题.
说到这里,我提一点关于攻击的问题,就是跑用户密码或者是用户名,一般常用的就是
- ....../show.asp?id=1 and 0<>(select count(*) from admin where id=3 and left(username,1)='a')
这样去一个一个尝试,当然我们不能在这里提什么Perl程序去跑密码,程序是别人写,要自己知道原理.这里我只是想给个比较方便的办法就是取ASC码范围.这个要比单独跑要快很多.不论是是字母,数字,汉字,特殊字符,他们总会有对应的ASC码,用以下办法:
- ....../show.asp?id=1 and 0<>(select count(*) from admin where id=3 and asc(right(left(username
- e,3),1)) between 1 and 10000)
剩下的就随你了,一般的从97到122就可以啦,字母嘛,很快D.呵呵,有人想用mid 函数当然也是不错 asc(mid(username,2,1)) between 1 and 10000 也成.
如何更加有效的防止SQL注入攻击?我们将在下面的文章中具体提到!
防范远程注入攻击
这类攻击在以前应该是比较常见的攻击方式,比如POST攻击,攻击者可以随便的改变要提交的数据值已达到攻击目的.又如:COOKIES 的伪造,这一点更值得引起程序编写者或站长的注意,不要使用COOKIES来做为用户验证的方式,否则你和把钥匙留给贼是同一个道理.
比如:
- If trim(Request. cookies ("uname"))="fqy" and Request.cookies("upwd")="fqy#e3i5.com" then
- ........more.........
- End if
我想各位站长或者是喜好写程序的朋友千万别出这类错误,真的是不可饶恕.伪造COOKIES 都多少年了,你还用这样的就不能怪别人跑你的密码.涉及到用户密码或者是用户登陆时,你最好使用session 它才是最安全的.如果要使用COOKIES就在你的COOKIES上多加一个信息,SessionID,它的随机值是64位的,要猜解它,不可能.例:
- if not (rs.BOF or rs.eof) then
- login="true"
- Session("username"&sessionID) = Username
- Session("password"& sessionID) = Password
- 'Response.cookies("username")= Username
- 'Response.cookies("Password")= Password
下面我们来谈谈如何防范远程注入攻击,一般的攻击都是将单表提交文件拖到本地,将Form ACTION="chk.asp" 指向你服务器中处理数据的文件即可.如果你全部的数据过滤都在单表页上,那么恭喜你,你将已经被脚本攻击了.
怎么才能制止这样的远程攻击?好办,请看代码如下: 程序体(9)
- <%
- server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
- server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
- if mid(server_v1,8,len(server_v2))<>server_v2 then
- response.write "<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>"
- response.write "<tr><td style=font:9pt Verdana>"
- response.write "你提交的路径有误,禁止从站点外部提交数据请不要乱该参数!"
- response.write "</td></tr></table></center>"
- response.end
- end if
- %>
- '个人感觉上面的代码过滤不是很好,有一些外部提交竟然还能堂堂正正的进来,于是再写一个. 这个是过滤效果很好,建议使用.
- if instr(request.servervariables("http_referer"),"http://"&request.servervariables("host") )<1 then
- response.write "处理 URL 时服务器上出错。<br>如果您是在用任何手段攻击服务器,那你应该庆幸,你的所有操作已经被服务器记录,我们会第一时间通知公安局与国家安全部门来调查你的IP. "
- response.end
- end if
程序体(9)
本以为这样就万事大吉了,在表格页上加一些限制,比如maxlength啦,等等..但天公就是那么不作美,你越怕什么他越来什么.你别忘了,攻击者可以突破sql注入攻击时输入框长度的限制.写一个SOCKET程序改变HTTP_REFERER?我不会。网上发表了这样一篇文章:
- Windows Registry Editor Version 5.00
- [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\扩展(&E)]@="C:\Documents and Settings\Administrator\桌面\len.htm" "contexts"=dword:00000004
- <script language=vbs>
- set srcevent = external.menuarguments.event
- set doc=external.menuarguments.document
- set ele=doc.elementfrompoint( srcevent.clientx, srcevent.clienty )
- if ele.type ="text" or ele.type="password" then
- ele.maxlength=200
- ele.size=200
- end if
- </script>
- '判断文件类型是否合格
- Private Function CheckFileExt (fileEXT)
- dim Forumupload
- Forumupload="gif,jpg,bmp,jpeg"
- Forumupload=split(Forumupload,",")
- for i=0 to ubound(Forumupload)
- if lcase(fileEXT)=lcase(trim(Forumupload(i))) then
- CheckFileExt=true
- exit Function
- else
- CheckFileExt=false
- end if
- next
- End Function
- '验证文件内容的合法性
- set MyFile = server.CreateObject ("Scripting.FileSystemObject")
- set MyText = MyFile.OpenTextFile (sFile, 1) ' 读取文本文件
- sTextAll = lcase(MyText.ReadAll): MyText.close
- '判断用户文件中的危险操作
- sStr ="8|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory"
- sStr = sStr & "|.saveas|wscript.shell|script.encode"
- sNoString = split(sStr,"|")
- for i = 1 to sNoString(0)
- if instr(sTextAll, sNoString(i)) <> 0 then
- sFile = Upl.Path & sFileSave: fs.DeleteFile sFile
- Response.write "<center><br><big>"& sFileSave &"文件中含有与操作目录等有关的命令"&_
- "<br><font color=red>"& mid(sNoString(i),2) &"</font>,为了安全原因,<b>不能上传。<b>"&_
- "</big></center></html>"
- Response.end
- end if
- next
程序体(10)
把他们加到你的上传程序里做一次验证,那么你的上传程序安全性将会大大提高.
什么?你还不放心?拿出杀手锏,请你的虚拟主机服务商来帮忙吧。登陆到服务器,将PROG ID 中的"shell.application"项和"shell.application.1"项改名或删除。再将"WSCRIPT.SHELL"项和"WSCRIPT.SHELL.1"这两项都要改名或删除。呵呵,我可大胆的说,国内可能近半以上的虚拟主机都没改过。只能庆幸你们的用户很合作,否则......我删,我删,我删删删......
小结
如何更好的达到防范SQL Injection的攻击?这里我个人给推荐几个办法,第一,免费程序不要真的就免费用,既然你可以共享原码,那么攻击者一样可以分析代码。如果有能力的站长最好还是更改一下数据库表名,字段名,只修改关键的admin, username, password就可以了,比如forum_upasswd 这样的字段名谁能猜到?如果你猜到了,最好赶快去买彩票吧,特等奖不是你还会有谁呢?另外,一般站点的关键就在于管理员的密码,很好的保护好你的管理员密码那是至关重要的,至少10位的数字字母组合。另外加上现在大多数站点程序都会使用MD5来加密用户密码,加上你密码的强壮性,那样你站点的安全性就大大的提高了。即使出现了SQL Injection漏洞,攻击者也不可能马上拿下你的站点。
通过本篇内容的学习,你可以全面掌握双绞线网线和细同轴电缆网线的制作方法。特别是双绞线网线的制作,因为这类网络目前应用最广,还要注意不同用途的双绞线网线制作方法(如直连线线和交叉线)。
一、双绞线网线的制作
双绞线网线的制作其实非常简单,就是把双绞线的4对8芯网线按一定规则插入到水晶头中,所以这类网线的制作所需材料仅需双绞线和水晶头;所需工具也较简单,通常仅需一把专用压线钳即可,这在上一篇已作详细介绍,在此就不再赘述了。双绞线网线的制作其实就是网线水晶头的制作。
这类网线制作的难点就是不同用途的网线跳线规则不一样,下面先来看最基本的直通五类线(不用跳线)的制作方法,其它类型网线的制作方法类似,不同的只是跳线方法不一样而已。
1. 直通RJ-45接头的制作
为了方便读者理解,下面以Step-By-Step方式一步步向大家介绍这类网线的制作方法,后面的章节及内容也尽量按这一方式进行。
第1步:用双绞线网线钳(当然也可以用其它剪线工具)把五类双绞线的一端剪齐(最好先剪一段符合布线长度要求的网线),然后把剪齐的一端插入到网线钳用于剥线的缺口中,注意网线不能弯,直插进去,直到顶住网线钳后面的挡位,稍微握紧压线钳慢慢旋转一圈(无需担心会损坏网线里面芯线的包皮,因为剥线的两刀片之间留有一定距离,这距离通常就是里面4对芯线的直径),让刀口划开双绞线的保护胶皮,拔下胶皮。如图1所示。当然也可使用专门的剥线工具来剥皮线。
【小提示】网线钳挡位离剥线刀口长度通常恰好为水晶头长度,这样可以有效避免剥线过长或过短。剥线过长一则不美观,另一方面因网线不能被水晶头卡住,容易松动;剥线过短,因有包皮存在,太厚,不能完全插到水晶头底部,造成水晶头插针不能与网线芯线完好接触,当然也不能制作成功了。
图1
第2步:剥除外包皮后即可见到双绞线网线的4对8条芯线,并且可以看到每对的颜色都不同。每对缠绕的两根芯线是由一种染有相应颜色的芯线加上一条只染有少许相应颜色的白色相间芯线组成。四条全色芯线的颜色为:棕色、橙色、绿色、蓝色。
先把4对芯线一字并排排列,然后再把每对芯线分开(此时注意不跨线排列,也就是说每对芯线都相邻排列),并按统一的排列顺序(如左边统一为主颜色芯线,右边统一为相应颜色的花白芯线)排列。注意每条芯线都要拉直,并且要相互分开并列排列,不能重叠。然后用网线钳垂直于芯线排列方向剪齐(不要剪太长,只需剪齐即可),如图2所示。自左至右编号的顺序我们定为“1.2.3.4.5.6.7.8”。
图2
第3步:左手水平握住水晶头(塑料扣的一面朝下,开口朝右),然后把剪齐、并列排列的8条芯线对准水晶头开口并排插入水晶头中,注意一定要使各条芯线都插到水晶头的底部,不能弯曲(因为水晶头是透明的,所以可以从水晶头有卡位的一面可以清楚地看到每条芯线所插入的位置)。
第4步:确认所有芯线都插到水晶头底部后,即可将插入网线的水晶头直接放入网线钳压线缺口中,如图3所示。因缺口结构与水晶头结构一样,一定要正确放入才能使后面压下网线钳手柄时所压位置正确。水晶头放好后即可压下网线钳手柄,一定要使劲,使水晶头的插针都能插入到网线芯线之中,与之接触良好。然后再用手轻轻拉一下网线与水晶头,看是否压紧,最好多压一次,最重要的是要注意所压位置一定要正确。
图3
至此,这个RJ-45头就压接好了。按照相同的方法制作双绞线的另一端水晶头,要注意的是芯线排列顺序一定要与另一端的顺序完全一样,这样整条网线的制作就算完成了。
两端都做好水晶头后即可用网线测试仪进行测试,如果测试仪上8个指示灯都依次为绿色闪过,证明网线制作成功。如果出现任何一个灯为红灯或黄灯,都证明存在断路或者接触不良现象,此时最好先对两端水晶头再用网线钳压一次,再测,如果故障依旧,再检查一下两端芯线的排列顺序是否一样,如果不一样,随剪掉一端重新按另一端芯线排列顺序制做水晶头。如果芯线顺序一样,但测试仪在重夺后仍显示红色灯或黄色灯,则表明其中肯定存在对应芯线接触不好。此时没办法了,只好先剪掉一端按另一端芯线顺序重做一个水晶头了,再测,如果故障消失,则不必重做另一端水晶头,否则还得把原来的另一端水晶头也剪掉重做。直到测试全为绿色指示灯闪过为止。
如图4所示的是一条两端都制作好水晶头的网线,当然这是一条由专业公司用机器制作的双绞线网线。
图4
二、网线的跳线规则
以上我们所介绍的是最简单的直通网线制作方法,这类网线通常只用于从集线器(交换机)、墙上信息模块到工作站的连接,并且并不是一种最理想的制作方法。主要原因是这种网线制作没有考虑到相互芯线之间串扰,在高速网络(如100Mbps以上网络)中影响更大。为此IEEE标准委员会制定了几种特定用途的跳线方法,下面分别介绍。
双绞线在网络中的接线标准有以下几种:
(1)一一对应接法。即双绞线的两端芯线要一一对应,即如果一端的第1脚为绿色,另一端的第1脚也必须为绿色的芯线,这样做出来的双绞线通常称之为“直连线”。但要注意的是4个芯线对通常不分开,即芯线对的两条芯线通常为相邻排列。这种网线一般是用在集线器或交换机与计算机之间的连接。
(2)1-3、2-6交叉接法。虽然双绞线有4对8条芯线,但实际上在网络中只用到了其中的4条,即水晶头的第1、第2和第3、第6脚,它们分别起着收、发信号的作用。这种交叉网线的芯线排列规则是:网线一端的第1脚连另一端的第3脚,网线一端的第2脚连另一头的第6脚,其他脚一一对应即可。这种排列做出来的通常称之为“交叉线”,水晶头的针脚排编号规则如图5所示。
图5
例如,当线的一端从左到右的芯线顺序依次为:白绿、绿、白橙、蓝、白蓝、橙、白棕、棕时,另一端从左到右的芯线顺序则应当依次为:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕。当线的一端从左到右的芯线顺序依次为:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕时,另一端从左到右的芯线顺序则应当依次为:白绿、绿、白橙、蓝、白蓝、橙、白棕、棕。这种网线一般用在集线器(交换机)的级连、服务器与集线器(交换机)的连接、对等网计算机的直接连接等情况下。
(3)100M接法。这是一种最常用的网线制作规则。所谓100M接法,是指它能满足100M带宽的通讯速率。它的接法虽然也是一一对应,但每一脚的颜色是固定的,具体是:第1脚——橙白、第2脚——橙色、第3脚——绿白、第4脚——蓝色、第5脚——蓝白、第6脚——绿色、第7脚——棕白、第8脚——棕色,从中可以看出,网线的4对芯线并不全都是相邻排列,第3脚、第4脚、第5脚和第6脚包括2对芯线,但是顺序已错乱。其实这种跳线规则与下面将要介绍的信息模块端接方式B是完全一样的,当然我们也可以按信息模块端接方式A来重新排列芯线顺序,那就是:第1脚——绿白、第2脚——绿色、第3脚——橙白、第4脚——蓝色、第5脚——蓝白、第6脚——橙色、第7脚——棕白、第8脚——棕色。只不过所选方式要与下面所介绍的信息模块端接方式一致,否则所做的网线很可能就不通了。
这种接线方法也是应用于集线器(交换机)与工作站计算机之间的连接,也就是“直连线”所应用的范围。
三、信息模块的跳线规则
上面介绍了双绞线网线的跳线规则,因为在企业网络中通常不是直接拿网线的水晶头插到集线器或交换机上,而是先把来自集线器或交换机的网线与信息模块连在一起埋在墙上,所以这就涉及到信息模块芯线排列顺序问题,也即跳线规则。
交换机或集线器到网络模块之间的网线接线方法是按市线EIA/TIA 568标准进行,但因其有A、 B两种端接方式(IBM公司的产品通常用端接方式A,AAT&T公司的产品通常用端接方式B,端接方式的主要区别在下述的T568A模块和T568B模块的内部固定联线方式)。两种端接方式所对应的接线顺序如下表1所示:
虽然从集线器或交换机到工作站的网线可以是不经任何跳线的直连线,但为了保证网络的高性能,最好同一网络采取同一种端接方式,包括信息模块和网线水晶头。水晶头和信息模块各引脚的对应顺序如图6的左、右图所示。因为在信息模块各线槽中都有相应的颜色标注,只需要选择相应的端接方式,然后按模块上的颜色标注把相应的芯线卡入相应的线槽中即可,不必去记表1所示的颜色顺序。
图6
【说明】图7中的1、2、3、4、5、6、7、8顺序不是随便定的,它是在把水晶头有金属弹片的一面向上,塑料扣片向下,插入RJ-45座的一头向外,从左到右依次为1、2、3、4、5、6、7、8脚。而信息模块的引脚顺序如图6右图有明确的标注,在此就不再另叙了。
四、信息模块的制作
了解了以上信息模块的跳线规则后,我们就可以利用在上一篇所介绍的材料和打线工具制作信息模块了。具体的制作步骤如下:
第1步:用剥线工具在离双绞线一端130mm长度左右把双绞线的外包皮剥去。如图7所示。
图7
第2步:如果有信息模块打线保护装置,则可将信息模块嵌入在保护装置上,如图8所示。
图8
第3步:把剥开的4对双绞线芯线分开,但为了便于区分,此时最好不要拆开各芯线线对,只是在卡相应芯线时才拆开。按照信息模块上所指示的芯线颜色线序,两手平拉上一小段对应的芯线,稍稍用力将导线一一置入相应的线槽内,如图9所示。
图9
第4步:全部芯线都嵌入好后即可用打线钳再一根根把芯线进一步压入线槽中(也可在第3步操作中完成一根即用打线钳压入一根,但效率低些),确保接触良好,如图10所示。然后剪掉模块外多余的线。
图10
【小提示】通常情况下,信息模块上会同时标记有TIA 568-A和TIA 568-B两种芯线颜色线序,应当根据布线设计时的规定,与其他连接和设备采用相同的线序。
第5步:将信息模块的塑料防尘片沿缺口穿入双绞线,并固定于信息模块上,如图11所示,压紧后即可完成模块的制作全过程。然后再把制作好的信息模块放入信息插座中。
图11
信息模块制作好后当然也可以测试一下连接是否良好,此时可用万用表进行测量。把万用表的档位打在x10的电阻档,把万用珠的一个表针与网线的另一端相应芯线接触,另一万用表笔接触信息模块上卡入相应颜色芯线的卡线槽边缘(注意不是接触芯线),如果阻值很小,则证明信息模块连接良好,否则再用打线钳压一下相应芯线,直到通畅为止。
五、细同轴电缆网线的制作
在20台以内的小型局域网中,目前还有一部分企业网络仍采用细同轴电缆连接,所以在此有必要对这种网线的制作进行详细介绍。具体步骤如下:
第1步:用同轴电缆专用剥线钳将细缆外皮剥除,露出芯线长约3mm,白色保护层约4mm,屏蔽层约8mm,如图12所示。
图12
第2步,将探针套入网线的芯线上,一直要插到底,然后再把套上探针的芯线插入到同轴电缆专用压线钳中间的探针小圆孔中,压紧,使探针与网线芯线紧连,如图13所示。
图13
第3步:将BNC连接器金属套环套入压好镀金探针的细同轴电缆,然后再将网线连接探针的一端从BNC接头小的一端插入(也要插到底),如图14所示。
图14
第4步:把套在网线的金属套环推到网线与BNC连接器连接处,再把网线钳的六角缺口卡在确定好的套环位置上,紧握网线钳手柄,紧压,使网线与BNC连接器通过BNC金属套环紧紧连接起来,如图15所示。压好后的金属套环呈六角形。
图15
至此,细缆的一端制作完成,然后,接照上面的步骤制作另一端的BNC接头。
细缆制作完毕以后,应当使用上述的网线测试仪进行连通性测试。如果没有网线测试仪,也可以普通的万用电表进行测试,测量时需将万用表挡位打在x10电阻档,只要用表笔的两端分别接触探针或者连接器内壁,如果电阻很小,证明网线的制作是成功的。如果任一方测试阻值较大(表针不摆动或者摆动非常小),证明网线制作不成功,连接阻抗过高,需重新制作。
好了,双绞线网线和同轴电缆网线的制作方法就介绍至此,相信各位已经掌握了相应的制作方法。后面的几篇中将要介绍网络组建的下一个重要方面,即网卡的有关方面,包括网卡的基础知识及配置,在这其中将涉及网络组建的最重要方面,即通信协议的选择与配置、IP地址的分配等各方面,请各位留意!
ASP.Net种使用C#, 向CoreDB.myBBS表中插入记录值(Title, Content)【文章的标题和内容】,由于Content, Title中可能包含单引号,直接使用sql的insert命令会报错,对此有两种处理方法,一种将单引号替换成两个单引号,第2种方法是使用存储过程。
表myBBS的格式定义如下:
- CREATE TABLE [dbo].[myBBS] (
- [ID] [bigint] IDENTITY (1, 1) NOT NULL ,
- [Title] [char] (160) COLLATE Chinese_PRC_CI_AS NULL ,
- [Author] [char] (20) COLLATE Chinese_PRC_CI_AS NULL ,
- [Date_of_Created] [datetime] NULL ,
- [Abstract] [char] (480) COLLATE Chinese_PRC_CI_AS NULL ,
- [Content] [ntext] COLLATE Chinese_PRC_CI_AS NOT NULL
- ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
1、将单引号用两个单引号替换:
- SqlConnection coreDB=new SqlConnection();
- coreDB.ConnectionString= "workstation id=\"GQA-ERIC-LV\";packet size=4096;integrated security=SSPI;" +
- "data source=\"gqa-eric-lv\";persist security info=False;initial catalog=CoreDB";
- //单引号用"''"替换,以插入'到SQL Server中;
- string Title=TextBox1.Text.Replace("'","''");
- string Content=TextBox2.Text.Replace("'","''");
- if(Title.Trim()==""||Content.Trim()=="")return;
- string insertCMD =@"insert into myBBS (Title,Content) Values('"+ Title + "','" +Content+"')";
- SqlCommand myCommand = new SqlCommand(insertCMD,coreDB);
- coreDB.Open();
- SqlDataReader myReader = myCommand.ExecuteReader();
- myReader.Close();
- coreDB.Close();
2、使用存储过程来插入
1) 创建存储过程:
- Create proc InsertMyBBSProc(@Title char(160), @Author char(20), @Content ntext)
- AS
- Insert into myBBS(Title,Author,Content) Values(@Title, @Author, @Content)
2) 查询分析器中测试存储过程:
- declare @title char(160)
- declare @author char(20)
- declare @content char(600)
- set @title='test title 3'
- set @author='david euler 3'
- set @content='it is the content 3'
- exec InsertMyBBSProc @title, @author, @content
3) C#中通过SqlCommand执行存储过程:
- SqlConnection coreDB=new SqlConnection();
- coreDB.ConnectionString= "workstation id=\"GQA-ERIC-LV\";packet size=4096;integrated security=SSPI;" +
- "data source=\"gqa-eric-lv\";persist security info=False;initial catalog=CoreDB";
- string Title=TextBox1.Text;
- string Content=TextBox2.Text;
- if(Title.Trim()==""||Content.Trim()=="")return;
- //InsertMyBBSProc是向MyBBS中插入数据的Procedure:
- SqlCommand insertCMD = new SqlCommand("InsertMyBBSProc",coreDB);
- insertCMD.CommandType=CommandType.StoredProcedure;//命令类型为存储过程;下面定义参数对象:
- SqlParameter prm1=new SqlParameter("@Title", SqlDbType.Char,160);
- SqlParameter prm2=new SqlParameter("@Author", SqlDbType.Char,20);
- SqlParameter prm3=new SqlParameter("@Content",SqlDbType.NText,1073741823);
- prm1.Direction=ParameterDirection.Input;
- prm2.Direction=ParameterDirection.Input;
- prm3.Direction=ParameterDirection.Input;
- //为insertCMD添加SQL参数:
- insertCMD.Parameters.Add(prm1);
- insertCMD.Parameters.Add(prm2);
- insertCMD.Parameters.Add(prm3);
- //为SQL参数赋值:
- prm1.Value=Title;
- prm2.Value="David Euler";
- prm3.Value=Content;
- coreDB.Open();
- int recordsAffected=insertCMD.ExecuteNonQuery();
- if(recordsAffected==1)Response.Write("<script>alert('"+ "插入成功" +"');</script>");
- coreDB.Close();
转贴:http://dev.csdn.net/article/51/51067.shtm
概要
本文介绍如何 telnet 到运行简单邮件传输协议 (SMTP) 服务的计算机上的端口 25,以解决 SMTP 通信问题。默认情况下,SMTP 侦听端口 25。
您可以根据您遇到的问题类型选用以下适当的疑难解答步骤。例如,如果您在两台 Microsoft Exchange 2000 Server 服务器之间通过 SMTP 发送邮件时遇到问题,则可以通过在发送服务器上使用 Telnet 连接到目标服务器上的端口 25 来测试 SMTP 连接。或者,如果您在接收来自 Internet 的 SMTP 邮件时遇到问题,则可以按照本文中列出的步骤,测试驻留在 Internet 上但不在您的网络上的主机与您的 SMTP 服务器的连接。
更多信息
Microsoft 产品线中有 SMTP 的多个不同变体。Microsoft Windows 产品线的 SMTP 服务包含在 Internet 信息服务 (IIS) 中,而在 Microsoft Windows NT Server 4.0 中,SMTP 服务包含在 Option Pack 中。在较新版本的 Windows 中,IIS 已被集成到操作系统中,并且您可以使用“控制面板”中的“添加或删除程序”添加 IIS。此外,Exchange 2000 和 Microsoft Exchange Server 2003 都使用 IIS 中的现有 SMTP 服务及其他功能。Microsoft Exchange Server 版本 4.0、5.0 和 5.5 均包含它们自己的 SMTP 版本,所采用的形式为 Internet Mail Connector (IMC) 或 Internet Mail Service (IMS)。
注意:在 Exchange 5.0 及更高版本中,Internet Mail Connector (IMC) 被重命名为 Internet Mail Service。
在启动 Telnet 会话之前,必须具有要将此测试邮件发送到的目标用户的完整 SMTP 电子邮件地址。该电子邮件地址必须采用以下格式:
User@Site.Domain.com
您也可以具有运行 SMTP 服务的服务器计算机的完全限定域名 (FQDN) 或 IP 地址(例如,10.120.159.1)。如果服务器在您的组织中,您可能已经拥有这些信息。如果服务器是外部服务器,查找这些信息最简单的方法是使用 Nslookup.exe 以找到包含这些信息的 DNS 记录。 有关 NSlookup 的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
200525 使用 NSlookup.exe
有关如何获取 Internet 邮件交换器记录的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
203204 XFOR:如何获取 Internet 邮件交换器记录
确保运行 SMTP 服务的服务器上已启动 SMTP。要测试 SMTP 是否已启动,您可以运行本文中列出的基本测试,并验证您是否会收到来自远程服务器的 220 消息。这还将验证 SMTP 是否正在运行。
注意:
有些 Telnet 应用程序要求您打开本地回显功能,以查看键入的命令。要在 Microsoft Telnet 会话中执行此操作,请在命令提示符处键入 set local_echo。
在 Microsoft Windows XP 中,应键入 set localecho 而不是 set local_echo。
基本测试
按照下列步骤操作,以确保主机和远程 SMTP 服务器能够通信。 如果在您键入以下任一命令之后,收到以下错误信息,则说明 SMTP 服务器因为语法错误或命令错误而无法识别您所键入的内容:
500 Command not recognized
检查该命令并再次键入它,或者验证您是否正在与 Microsoft SMTP 服务器直接通信。
注意:Microsoft Telnet 不允许您使用 Backspace 键。如果在键入时出错,必须按 Enter 键,然后开始键入新的命令。
在以下步骤中,您要从命令行中运行 Telnet。要打开命令行,请单击“开始”,单击“运行”,在“打开”框中键入 cmd,然后单击“确定”。
您可以通过使用以下格式的 Telnet 命令来启动 Telnet 会话:
注意:在键入每行内容之后按 Enter 键。
telnet 服务器名端口号
例如,键入:
- telnet mail.contoso.com 25
注意:您可以将服务器名 替换为您要连接到的 SMTP 服务器的 IP 地址或 FQDN。 记住在键入每个命令之后按 Enter 键。
如果该命令起作用,您将会收到来自 SMTP 服务器的类似以下内容的消息:
220 site.contoso.com Microsoft Exchange Internet Mail Connector <IMC 的版本号>
注意:由于有许多不同版本的 Microsoft SMTP 或第三方 SMTP 服务器,因此您可能会收到来自接收服务器的不同的消息。不过,您肯定会收到包含服务器的 FQDN 和 SMTP 的版本的 220 消息。此外,所有版本的 Microsoft SMTP 在 220 消息中都包含“Microsoft”一词。
通过键入以下命令开始通信:
- EHLO test.com
注意:您可以使用 HELO 命令,但是 EHLO 是扩展 SMTP 动词集中的一个动词,SMTP 的所有当前 Microsoft 实现都支持该动词集。除非您认为扩展 SMTP 动词有问题,否则最好使用 EHLO。
如果该命令成功,您会收到以下消息:
250 OK
键入以下命令向接收 SMTP 服务器通知邮件发件人:
- MAIL FROM:Admin@test.com
注意:该地址可以是您想使用的任何 SMTP 地址,但是最好考虑以下问题:
有些 SMTP 邮件系统会基于 MAIL FROM:地址筛选邮件,并且会禁止某些 IP 地址连接到 SMTP 邮件系统,或者如果连接 IP 地址与 SMTP 邮件系统所在的域不匹配,它还会禁止该地址向 SMTP 邮件系统发送电子邮件。在本例中,该域是 test.com。
如果您在发送邮件时没有使用有效的电子邮件地址,您将无法确定在发送邮件时是否有问题,因为未送达报告 (NDR) 无法到达无效的 IP 地址。如果您使用有效的电子邮件地址,您将会收到来自 SMTP 服务器的以下消息:
250 OK - MAIL FROM Admin@test.com
键入以下命令向接收 SMTP 服务器通知邮件的收件人。
注意:最好始终使用要发送到的域中的有效收件人 SMTP 地址。例如,如果您要发送到 john@domain.com,必须确保域中存在 john@domain.com。否则,您会收到 NDR。
使用您要发送到的人员的 SMTP 地址键入以下命令:
- RCPT TO:User@Domain.Com
您会收到以下消息:
250 OK - Recipient User@ Domain.Com
键入以下命令通知 SMTP 服务器您已准备好发送数据:
- DATA
您会收到以下消息:
354 Send data. End with CRLF.CRLF
您现在已可以开始键入邮件的 822/2822 部分。用户将会在他们的收件箱中看到邮件的这一部分。键入以下命令以添加主题行:
- Subject:test message
按两次 Enter 键。此命令不会显示任何信息。
注意:按两次 Enter 键为了与 Request for Comments (RFC) 822 和 2822 保持一致。它规定 822 命令后面必须跟一个空行。
键入以下命令以添加邮件正文:
- This is a test message you will not see a response from this command.
在下一个空行中键入英文句点 (.),然后按 Enter 键。 您会收到以下消息:
250 OK
键入以下命令关闭连接:
- QUIT
您会收到以下消息:
221 closing connection
验证收件人是否收到您发送的消息。如果在应用程序事件日志中出现任何错误事件消息,或者接收邮件时出现问题,请检查主机的配置或通信。
高级测试
除本文前面列出的基本测试步骤外,您还可以使用送达回执对邮件进行双向测试。您可以使用此方法验证 SMTP 服务器是否可以接受入站连接,并且为发件人生成一个送达回执以测试 SMTP 服务器的出站连接。
要为测试邮件请求送达回执,请参见本文“基本测试”一节的第 4 步,以确保提供的信息是可以接收送达回执的有效电子邮件地址。然后在本文“基本测试”一节的第 5 步中,在 Telnet 会话中键入以下命令:
RCPT TO:User@Site.Domain.Com notify=success,failure
- [root@zzy5156 root]# telnet 2mysite.net 25
- Trying 208.16.215.137...
- Connected to 2mysite.net.
- Escape character is '^]'.
- 220 2mysite.net (IMail 8.14 155604-2) NT-ESMTP Server X1
- EHLO zzy.cn
- 250 hello 2mysite.net
- VRFY root@2mysite.net
- 250 ok its for <root@2mysite.net>
- quit
- 221 Goodbye
vllddaee: vllddaee...
根据inotify + rsync的思路,现在有了个c++版本的同步程序,只需指
真是有耐心呀。我做了个pdf 文件 在上面的网站可以下载