0

我是 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)
4

2 回答 2

3

一个经常被忽视的命令是“验证”命令......因此您可以构建一种机制,为用户分配一个基于数字的 UID,然后是一个 PIN。将 PIN 放入名称为 UID 的文件中,然后当他们调用时,读取他们的 UID,Authenticate(uid_file_name),如果他们通过 Authenticate 输入正确的 PIN,则让他们访问。

于 2012-10-11T07:07:30.990 回答
0

我正在混合个人广告和语音邮件服务,我希望每个用户都能够提交一个广告,其他人可以通过记录进入该用户收件箱的消息来响应。

因此,您可以使用Record(),Playback()Voicemail()

  • Record()录制广告,
  • Playback()广告,
  • Voicemail()让用户记录他们的语音信箱

如果你想要更多的访问控制,我建议使用PHP AGI或使用AstDB

是的,很容易欺骗一个数字,对于访问控制,比如访问代码,使用Read可以将 DTMF 输入作为变量读取,可能与基于 CallerID Number 的过滤器结合使用,听起来是个好主意。

我还想知道是否有一个函数来检查一个字符串是否只包含数字?

您可以为此使用REGEX ,即。在宏中:

; Arg1: CALLERID(num)
[macro-dblookup]
exten => s,1,Set(isnumber=${REGEX("[0-9]" ${ARG1})})
exten => s,2,GotoIf($["${isnumber}" = "1"]?4)
exten => s,3,MacroExit()
exten => s,4,NoOp("Do something with number here")
exten => s,5,NoOp("...Db Lookup...")

在拨号盘中,您可以像这样调用宏 dblookup:

exten => 012345678,1,Noop("...")
exten => 012345678,n,Macro(dblookup,${CALLERID(num)})
于 2012-10-10T20:31:07.350 回答