我是 Asterisk 的新手,所以如果这个问题有一个我只是忽略的明显答案,请原谅我。
我正在混合个人广告和语音邮件服务,我希望每个用户都能够提交一个广告,其他人可以通过记录进入该用户收件箱的消息来响应。我最初的想法是纯粹基于 CALLERID(num) 值,但很快发现这有点不可靠。有时当我打电话时它会说匿名,有时它会给我一堆零,有时它会显示我的真实电话号码,而一旦它实际上只给我随机数字。在接听后但在我的第一个声音文件被触发之前,在我的拾音环境中,我确实有一个等待电话。我想知道解决这个问题的最佳方法是什么?我是否要求用户输入他们的电话号码,然后基于此生成一个代码,然后在您回拨时用作密码?我是否尝试使用 CALLERID(num) 来检测返回用户,或者从安全角度来看这是不建议的?
最好,我想完全避免使用代码,但有人告诉我,欺骗电话号码以侵入别人的收件箱相对容易。请注意,我不打算允许直接 SIP 呼叫,只能通过 IP 地址在白名单上的 PSTN/SIP 提供商。任何有关如何解决此问题的提示将不胜感激。基本上我想让我的用户尽可能简单,但要保持高安全性。
我还想知道是否有一个函数来检查一个字符串是否只包含数字?如果我决定以这种方式使用 CALLERID(num),在我在 MySql 数据库中查找电话号码之前,这将作为一个健全性检查很有用。
我非常基本且未完成的拨号方案如下:
[verify]
exten => blastbay,1,Answer(1000)
; A few simple sanity checks, but not very good ones.
same => n,GotoIf($["${CALLERID(num)}" != "0000000000"]?nextcheck)
; If we have only zero's, try waiting another second.
same => n,Wait(1)
same => n,GotoIf($["${CALLERID(num)}" = "0000000000"]?rejected)
same => n(nextcheck),GotoIf($["${CALLERID(num)}" = ""]?rejected)
same => n,GotoIf($["${CALLERID(num)}" = "anonymous"]?rejected)
same => n,GotoIf($["${CALLERID(num)}" = "unavailable"]?rejected)
same => n,GotoIf($["${CALLERID(num)}" = "protected"]?rejected)
same => n,GotoIf($[${LEN(${CALLERID(num)})}<5]?rejected)
same => n,Goto(welcome,welcomespeech,1)
same => n(rejected),Playback(/usr/phone/rejected)
same => n,Hangup()
[welcome]
include => mainmenu
exten => welcomespeech,1,BackGround(/usr/phone/welcome)
same => n,Goto(mainmenu,menuspeech,1)
[mainmenu]
exten => menuspeech,1,BackGround(/usr/phone/mainmenu)
same => n,WaitExten(5)
exten => 1,1,Goto(information,infospeech,1)
exten => i,1,Goto(menuspeech,1)
exten => t,1,Goto(menuspeech,1)
[information]
exten => infospeech,1,BackGround(/usr/phone/information)
same => n,Goto(mainmenu,menuspeech,1)
exten => #,1,Goto(mainmenu,menuspeech,1)
exten => i,1,Goto(mainmenu,menuspeech,1)