社交是时代的主题。大众的生活需求正在改变。各种垂直社交APP接连不断。陌生社交的成功使社交网络服务APP燃烧,面对庞大的网络市场,社交产品几乎成为所有网民日常生活中不可缺少的应用程序。

网站或者APP注册页面,因为获取手机短信验证码的功能是暴露在外的,有可能会遇到短信接口被刷的情况,最严重的当属受到短信轰炸机的攻击,最严重的情况当属遭到自动化软件的攻击;那短信验证码防刷策略如何做呢?首先我们来了解一下短信接口攻击:

短信接口攻击带来的影响
1、用户在无任何操作情况下,莫名收到大量短信验证码,对用户造成严重的骚扰;
2、使用短信验证码接口的用户,会被消耗大量的短信,同时,短信是以短信验证码接口客户的名义发出的,会对企业的品牌形象造成负面影响;
3、大量骚扰短信的发送,对短信通道及短信平台服务商的稳定安全运行造成极恶劣的影响。

如何有效防范短信接口攻击?
基于短信接口攻击的一些特点,我们有必要采用适当的短信验证码防刷策略,来降低甚至杜绝短信接口攻击软件对我们的影响,短信接口防御一般有以下一些措施:

1、短信平台系统拦截
平台会实时侦测对客户通过接口提交的每条短信,对恶意发送进行有效识别与拦截,能杜绝大多数的恶意发送。

2、对账户进行短信限流
短信接口支持多种方式的限流机制,用户可以根据自己的业务需要及特点,设置每天的最大发送量、每号码每天、每号码每分钟的发送量,将短信被刷的风险降低在可控范围内。

如账户短信达到当日最大发送量时,互亿无线短信平台会自动通过短信或微信通知您,您可以登录平台对发送量进行调整。

3、在用户注册页面增加人机验证
短信轰炸、短信攻击一般是采用软件进行自动攻击,在逻辑上,对用户先进性人机校验,校验通过之后才允许用户点击获取验证码按钮;人机校验的方式一般有以下几种:

a) 图形验证码:加上足够复杂的图形验证码可有效防止恶意工具的自动化调用,即当用户进行“短信验证码发送” 操作前, 弹出图形验证码,要求用户输入验证码后,服务器端再发送动态短信到用户手机上,该方法可有效解决被利用实施短 信轰炸攻击的问题。

b) 第三方人机校验:相较图形验证码,第三方人机校验服务的安全性更高,体验更好,不过一般都是要付费使用。

4、 在注册页面增加请求限制
a)对单个IP每天的请求次数做限制,如一天10次,超过即拒绝请求;
b)对同一号码的请求时间进行限制,单一用户请求验证码之后,需要间隔60-120秒才能再次请求;且同一号码每天最多只能请求5-10次;
c)将获取验证码功能放在表单(如填写用户名、密码等)和人机验证之后,即用户通过了表单校验和人机验证之后,才能点击获取验证码按钮。

短信验证码接口采用了以上一些防护措施之后,能防范绝大多数的短信接口攻击行为,大大节约您的短信成本;当然,这些策略需要在项目开发的时候就要考虑并配置。

代码示例

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<%

 '接口类型:互亿无线触发短信接口,支持发送验证码短信、订单通知短信等。
 '账户注册:请通过该地址开通账户http://user.ihuyi.com/?b5kwA
 '注意事项:
 '(1)调试期间,请使用用系统默认的短信内容:您的验证码是:【变量】。请不要把验证码泄露给其他人。
 '(2)请使用 APIID 及 APIKEY来调用接口,可在会员中心获取;
 '(3)该代码仅供接入互亿无线短信接口参考使用,客户可根据实际需要自行编写;

Response.Charset = "gb2312"

'asp UTF转GB2312   将UTF8编码文字转换为GB编码文字的asp代码
function UTF2GB(UTFStr)
for Dig=1 to len(UTFStr)
   '如果UTF8编码文字以%开头则进行转换
   if mid(UTFStr,Dig,1)="%" then
      'UTF8编码文字大于8则转换为汉字
     if len(UTFStr) >= Dig+8 then
        GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9))
        Dig=Dig+8
     else
       GBStr=GBStr & mid(UTFStr,Dig,1)
     end if
   else
      GBStr=GBStr & mid(UTFStr,Dig,1)
   end if
next
UTF2GB=GBStr
end function

'GB2312转UTF8的asp代码  将GB编码文字转换为UTF8编码文字
Function toUTF8(szInput)
     Dim wch, uch, szRet
     Dim x
     Dim nAsc, nAsc2, nAsc3
     '如果输入参数为空,则退出函数
     If szInput = "" Then
         toUTF8 = szInput
         Exit Function
     End If
     '开始转换
      For x = 1 To Len(szInput)
         '利用mid函数分拆GB编码文字
         wch = Mid(szInput, x, 1)
         '利用ascW函数返回每一个GB编码文字的Unicode字符代码
         '注:asc函数返回的是ANSI 字符代码,注意区别
         nAsc = AscW(wch)
         If nAsc < 0 Then nAsc = nAsc + 65536
    
         If (nAsc And &HFF80) = 0 Then
             szRet = szRet & wch
         Else
             If (nAsc And &HF000) = 0 Then
                 uch = "%" & Hex(((nAsc \ 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
                 szRet = szRet & uch
             Else
                'GB编码文字的Unicode字符代码在0800 - FFFF之间采用三字节模版
                 uch = "%" & Hex((nAsc \ 2 ^ 12) Or &HE0) & "%" & _
                             Hex((nAsc \ 2 ^ 6) And &H3F Or &H80) & "%" & _
                             Hex(nAsc And &H3F Or &H80)
                 szRet = szRet & uch
             End If
         End If
     Next         
     toUTF8 = szRet
End Function

'二进制转换为十六进制的asp代码
function c2to16(x)
    i=1
    for i=1 to len(x) step 4
       c2to16=c2to16 & hex(c2to10(mid(x,i,4)))
    next
end function

'二进制转换为十进制的asp代码
function c2to10(x)
    c2to10=0
    if x="0" then exit function
      i=0
    for i= 0 to len(x) -1
       if mid(x,len(x)-i,1)="1" then c2to10=c2to10+2^(i)
    next
end function

'十六进制转换为二进制的asp代码
function c16to2(x)
     i=0
     for i=1 to len(trim(x))
       tempstr= c10to2(cint(int("&h" & mid(x,i,1))))
       do while len(tempstr)<4
          tempstr="0" & tempstr
       loop
       c16to2=c16to2 & tempstr
    next
end function

function c10to2(x)
    mysign=sgn(x)
    x=abs(x)
    DigS=1
    do
       if x<2^DigS then
         exit do
       else
         DigS=DigS+1
       end if
    loop
    tempnum=x
    i=0
    for i=DigS to 1 step-1
       if tempnum>=2^(i-1) then
          tempnum=tempnum-2^(i-1)
          c10to2=c10to2 & "1"
       else
          c10to2=c10to2 & "0"
       end if
    next
    if mysign=-1 then c10to2="-" & c10to2
end function

'UTF8编码文字将转换为汉字
function ConvChinese(x)
    A=split(mid(x,2),"%")
    i=0
    j=0
   for i=0 to ubound(A)
      A(i)=c16to2(A(i))
   next
   for i=0 to ubound(A)-1
     DigS=instr(A(i),"0")
     Unicode=""
     for j=1 to DigS-1
       if j=1 then
         A(i)=right(A(i),len(A(i))-DigS)
         Unicode=Unicode & A(i)
       else
          i=i+1
          A(i)=right(A(i),len(A(i))-2)
          Unicode=Unicode & A(i)
       end if
     next
     if len(c2to16(Unicode))=4 then
        ConvChinese=ConvChinese & chrw(int("&H" & c2to16(Unicode)))
     else
        ConvChinese=ConvChinese & chr(int("&H" & c2to16(Unicode)))
     end if
   next
end function

'GB2312中文转unicode(&#)的asp代码  将GB编码文字转换为unicode编码文字
function chinese2unicode(Str)
   dim i
   dim Str_one
   dim Str_unicode
   if(isnull(Str)) then
      exit function
   end if
   for i=1 to len(Str)
     Str_one=Mid(Str,i,1)
     Str_unicode=Str_unicode&chr(38)
     Str_unicode=Str_unicode&chr(35)
     Str_unicode=Str_unicode&chr(120)
     Str_unicode=Str_unicode& Hex(ascw(Str_one))
     Str_unicode=Str_unicode&chr(59)
   next
   chinese2unicode=Str_unicode
end function  

'URL地址编码解码函数
Function URLDecode(enStr)
dim deStr
dim c,i,v
deStr=""
for i=1 to len(enStr)
   c=Mid(enStr,i,1)
   if c="%" then
    v=eval("&h"+Mid(enStr,i+1,2))
    if v<128 then
     deStr=deStr&chr(v)
     i=i+2
    else
     if isvalidhex(mid(enstr,i,3)) then
      if isvalidhex(mid(enstr,i+3,3)) then
       v=eval("&h"+Mid(enStr,i+1,2)+Mid(enStr,i+4,2))
       deStr=deStr&chr(v)
       i=i+5
      else
       v=eval("&h"+Mid(enStr,i+1,2)+cstr(hex(asc(Mid(enStr,i+3,1)))))
       deStr=deStr&chr(v)
       i=i+3
      end if
     else
      destr=destr&c
     end if
    end if
   else
    if c="+" then
     deStr=deStr&" "
    else
     deStr=deStr&c
    end if
   end if
next
URLDecode=deStr
end function

'判断是否为有效的十六进制代码
function isvalidhex(str)
dim c
isvalidhex=true
str=ucase(str)
if len(str)<>3 then isvalidhex=false:exit function
if left(str,1)<>"%" then isvalidhex=false:exit function
   c=mid(str,2,1)
if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
   c=mid(str,3,1)
if not (((c>="0") and (c<="9")) or ((c>="A") and (c<="Z"))) then isvalidhex=false:exit function
end function

'请求数据到短信接口
Function Post(url,data)
	dim Https
	set Https=server.createobject("MSXML2.XMLHTTP")
	Https.open "POST",url,false
	Https.setRequestHeader "Content-Type","application/x-www-form-urlencoded"
	Https.send data
	if Https.readystate=4 then
		dim objstream
		set objstream = Server.CreateObject("adodb.stream")
		objstream.Type = 1
		objstream.Mode =3
		objstream.Open
		objstream.Write Https.responseBody
		objstream.Position = 0
		objstream.Type = 2
		objstream.Charset = "utf-8"
		Post = objstream.ReadText
		objstream.Close
		set objstream = nothing
		set https=nothing
	end if
End Function

'函数返回随机整数。
Function gen_key(digits)	
	'Create and define array
	dim char_array(50)
	char_array(0) = "0"
	char_array(1) = "1"
	char_array(2) = "2"
	char_array(3) = "3"
	char_array(4) = "4"
	char_array(5) = "5"
	char_array(6) = "6"
	char_array(7) = "7"
	char_array(8) = "8"
	char_array(9) = "9"
	
	'Initiate randomize method for default seeding
	randomize
	
	'Loop through and create the output based on the the variable passed to
	'the function for the length of the key.
	do while len(output) < digits
	num = char_array(Int((9 - 0 + 1) * Rnd + 0))
	output = output + num
	loop
	
	'Set return
	gen_key = output
End Function


Dim mobile
mobile = request("mobile")	'手机号码


    if mobile="" then
       response.Write("手机号码不能为空")
    else
		
		if request.Form("send_code") = "" or Session("send_code")<>request.Form("send_code") then
			'防用户恶意请求
			response.Write("请求超时,请刷新页面后重试")
		else	
			     
			dim target,post_data,content,res,mobile_code
			mobile_code = gen_key(4)
			Session("mobile_code") = mobile_code
			'Response.Cookies("mobile_code") = mobile_code
			Session("mobile") = mobile
			'Response.Cookies("mobile") = mobile
			target = "http://106.ihuyi.com/webservice/sms.php?method=Submit"
			content = toUTF8("您的验证码是:"&mobile_code&"。请不要把验证码泄露给其他人。")
			post_data = "account=用户名&password=密码&mobile="&mobile&"&content="&content
			'查看用户名 登录用户中心->验证码通知短信>产品总览->API接口信息->APIID
			'查看密码 登录用户中心->验证码通知短信>产品总览->API接口信息->APIKEY
			'Response.write toUTF8("短信测试")
			'response.Write(UTF2GB(Post(target,post_data)))
	
			tempstr = UTF2GB(Post(target,post_data))
			'if instr(tempstr,"提交成功")>0 Then
				'response.Write("true") 
			'else
				'response.Write("error") 
			'end if
	
			Dim len1,len2
			len1 = instr(1,tempstr,"</code>",1)-1
			len2 = instr(1,tempstr,"<code>",1)
			'response.Write(len2)
			code=left(tempstr,len1)
			code=right(code,(len1-len2-5))
			'response.Write(code)
	
			Dim len3,len4
			len3 = instr(1,tempstr,"</msg>",1)-1
			len4 = instr(1,tempstr,"<msg>",1)
			'response.Write(len2)
			msg=left(tempstr,len3)
			msg=right(msg,(len3-len4-4))
			response.Write(msg)
			
		end if

    end If
%>

Logo

网易易盾是国内领先的数字内容风控服务商,依托网易二十余年的先进技术和一线实践经验沉淀,为客户提供专业可靠的安全服务,涵盖内容安全、业务安全、应用安全、安全专家服务四大领域,全方位保障客户业务合规、稳健和安全运营。

更多推荐