提交 f4b2efba authored 作者: Michael Giagnocavo's avatar Michael Giagnocavo

Be safe; use parameters. Detect bad ODBC drivers and refuse to load.

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14409 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 502a5a21
...@@ -4,12 +4,8 @@ ...@@ -4,12 +4,8 @@
<add key="connectionString" value="DSN=easyroute;User=root;Pwd=;" /> <add key="connectionString" value="DSN=easyroute;User=root;Pwd=;" />
<add key="defaultProfile" value="sofia/default"/> <add key="defaultProfile" value="sofia/default"/>
<add key="defaultGateway" value="192.168.1.1"/> <add key="defaultGateway" value="192.168.1.1"/>
<!-- query can be changed, but fields must be in the same order, and the number parameter must be %number% --> <!-- query can be changed, but fields must be in the same order, and the number parameter must be ? -->
<add key="query" value="SELECT gateways.gateway_ip, gateways.group, gateways.limit, gateways.techprofile, numbers.acctcode, numbers.translated from gateways, numbers where numbers.number = %number% and numbers.gateway_id = gateways.gateway_id;" /> <add key="query" value="SELECT gateways.gateway_ip, gateways.group, gateways.limit, gateways.techprofile, numbers.acctcode, numbers.translated from gateways, numbers where numbers.number = ? and numbers.gateway_id = gateways.gateway_id;" />
<!-- MySQL and other DBs improperly consider \ to be an escape character. easyroute will remove all backslashes from queries to be safe.
if you can handle backlashes properly, set keepBackslashes to true. -->
<!-- <add key="keepBackslashes" value="false" -->
<!-- To avoid other injections, the incoming number will remove characters matching this regex. Default [^0-9#\*] allows only digits, # and *.--> <!-- To avoid other injections, the incoming number will remove characters matching this regex. Default [^0-9#\*] allows only digits, # and *.-->
<add key="numberRegexFilter" value="[^0-9#\*]" /> <add key="numberRegexFilter" value="[^0-9#\*]" />
......
...@@ -6,15 +6,25 @@ open FreeSWITCH ...@@ -6,15 +6,25 @@ open FreeSWITCH
type QueryResult = { dialstring: string; group: string; acctcode: string; limit: int; translated: string } type QueryResult = { dialstring: string; group: string; acctcode: string; limit: int; translated: string }
module easyroute = module easyroute =
// Basic config
let defaultStr def = function null | "" -> def | s -> s let defaultStr def = function null | "" -> def | s -> s
let getAppSetting (name:string) = match Configuration.ConfigurationManager.AppSettings.Get name with null -> "" | x -> x let getAppSetting (name:string) = match Configuration.ConfigurationManager.AppSettings.Get name with null -> "" | x -> x
let connString = getAppSetting "connectionString" let connString = getAppSetting "connectionString"
let defaultProfile = getAppSetting "defaultProfile" let defaultProfile = getAppSetting "defaultProfile"
let defaultGateway = getAppSetting "defaultGateway" let defaultGateway = getAppSetting "defaultGateway"
let query = getAppSetting "query" let query = getAppSetting "query"
let configOk = [ connString; defaultProfile; defaultGateway; query; ] |> List.forall (String.IsNullOrEmpty >> not) let configOk = [ connString; defaultProfile; defaultGateway; query; ] |> List.forall (String.IsNullOrEmpty >> not)
let keepBackslashes = defaultStr "false" (getAppSetting "keepBackslashes") = "true"
let numberRegexFilter = defaultStr "[^0-9#]" (getAppSetting "numberRegexFilter") let numberRegexFilter = defaultStr "[^0-9#]" (getAppSetting "numberRegexFilter")
// Determine if ODBC driver quotes parameters properly - MySQL < 3.51.16 apparently does not
// We'll select the string "'" -- if quoting works, we'll get ' back. Otherwise, it'll fail, and we'll refuse to load
// Error 1064 seems to be the syntax error code MySQL returns. Otherwise, the exception will still stop it from loading, just less gracefully.
let odbcOk = use conn = new Odbc.OdbcConnection(connString)
use comm = new Odbc.OdbcCommand("SELECT ?", conn)
comm.Parameters.AddWithValue("@test", "'") |> ignore
conn.Open()
try string (comm.ExecuteScalar()) = "'"
with :? Odbc.OdbcException as ex when ex.Errors.Count > 0 && ex.Errors.[0].NativeError = 1064 -> false
let formatDialstring number gateway profile separator = let formatDialstring number gateway profile separator =
match separator with match separator with
...@@ -39,11 +49,9 @@ module easyroute = ...@@ -39,11 +49,9 @@ module easyroute =
let lookup (number: string) sep = let lookup (number: string) sep =
try try
let number = if numberRegexFilter = "" then number else Text.RegularExpressions.Regex.Replace(number, numberRegexFilter, "", regexOpts) let number = if numberRegexFilter = "" then number else Text.RegularExpressions.Regex.Replace(number, numberRegexFilter, "", regexOpts)
let number = if keepBackslashes then number else number.Replace("\\", "")
let query = query.Replace("%number%", sprintf "'%s'" (number.Replace("'", "''"))) // Don't use params cause some odbc drivers are awesome
Log.WriteLine(LogLevel.Debug, "EasyRoute query prepared: {0}", query)
use conn = new Odbc.OdbcConnection(connString) use conn = new Odbc.OdbcConnection(connString)
use comm = new Odbc.OdbcCommand(query, conn) use comm = new Odbc.OdbcCommand(query, conn)
comm.Parameters.AddWithValue("@number", number) |> ignore
conn.Open() conn.Open()
use reader = comm.ExecuteReader CommandBehavior.SingleRow use reader = comm.ExecuteReader CommandBehavior.SingleRow
match reader.Read() with match reader.Read() with
...@@ -67,7 +75,8 @@ type EasyRoute() = ...@@ -67,7 +75,8 @@ type EasyRoute() =
interface ILoadNotificationPlugin with interface ILoadNotificationPlugin with
member x.Load() = member x.Load() =
if not configOk then Log.WriteLine(LogLevel.Alert, "EasyRoute configuration is missing values.") if not configOk then Log.WriteLine(LogLevel.Alert, "EasyRoute configuration is missing values.")
configOk if not odbcOk then Log.WriteLine(LogLevel.Critical, "ODBC driver doesn't handle quoting properly; upgrade driver.")
configOk && odbcOk
interface IApiPlugin with interface IApiPlugin with
member x.ExecuteBackground ctx = member x.ExecuteBackground ctx =
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论