【问题标题】:Caller ID in Asterisk for user identificationAsterisk 中的呼叫者 ID 用于用户识别
【发布时间】:2012-10-10 19:19:13
【问题描述】:

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

【问题讨论】:

  • 您能展示一下您在拨号方案中尝试过的内容吗?

标签: sip voip asterisk


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    • Record()录制广告,
    • Playback() 广告,
    • Voicemail() 供用户录制他们的语音邮件

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

    是的,为了访问控制,例如访问代码,欺骗数字很容易, 使用Read,您将 DTMF 输入读取为变量,可能与基于来电显示号码的过滤器结合使用,听起来是个好主意。

    我也想知道有没有函数可以检查字符串是否只包含数字?

    您可以为此使用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...")
    

    在拨号盘中你可以像这样调用macro-dblookup:

    exten => 012345678,1,Noop("...")
    exten => 012345678,n,Macro(dblookup,${CALLERID(num)})
    

    【讨论】:

    • 非常感谢您提供的代码示例和提示!您对此的安全方面有什么建议吗?
    • 您可以查找访问代码,可能是 4-8 位 PIN,您可以通过 DTMF Read() 获得该代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多