【问题标题】:How do I match variables from FreeRADIUS in PostgreSQL with the LIKE operator?如何将 PostgreSQL 中 FreeRADIUS 中的变量与 LIKE 运算符匹配?
【发布时间】:2014-07-28 07:39:08
【问题描述】:

在由 FreeRADIUS 执行的 PostgreSQL 查询中,我想做类似的事情(表名和值只是示例):

SELECT name
FROM users
WHERE city LIKE '%blahblah%';

但有一个问题:blahblah 值包含在 FreeRADIUS 变量中,用“%{variable-name}”表示。它扩展为“blahblah”。

现在我的问题是:如何使用 LIKE 运算符将 %{variable-name} 变量与存储在表中的值匹配?

我尝试过使用

SELECT name
FROM users
WHERE city LIKE '%%{variable-name}%';

但它不能像那样正确展开,显然是不正确的。

我想要实现的最终查询是

...
WHERE city LIKE '%blahblah%';

因此它与存储在表中的包含“blahblah”的较长字符串匹配,但我希望变量动态扩展为正确的查询。有办法吗?

谢谢!

【问题讨论】:

  • 那么,blahblah%{variable-name} 的值从何而来?请展示一个完整的示例,最好使用表的创建表和插入语句。 FreeRADIUS 是否检测到这些变量字符串并将它们直接替换到 SQL 中?您是否希望在 PostgreSQL 中执行此操作?
  • 另外,“没有正确展开”怎么办? “明显不正确”怎么办?执行什么 SQL?
  • 嗯,这是我添加到 freeradius 的授权部分的一个查询,用于清理陈旧的会话。这个想法是如果新的身份验证请求来自相同的 MAC 地址,则删除具有 NULL acctstoptime 的会话。由于我的 NAS 未能在 Accounting-Request 数据包中为 radius 服务器提供“Calling-Station-Id”(wifi 站的 MAC)字段,因此 freeradius 在记帐 INSERT 期间没有将 wifi 站的 MAC 地址存储在 callstationid 列中.
  • 因此,我修改了accounting_start 查询,改为在radacct 表的callingstationid 列中插入Acct-Multi-Session-Id。 Acct-Multi-Session-Id 包含站点的 MAC,但它是一个较长的字符串,其中还包含 NAS 的 MAC。因此,在我的会话清理查询中,我需要使用 WHERE 和 LIKE 进行更新,以将 %{Calling-Station-Id} 变量(在运行查询之前由 FreeRADIUS 动态扩展)与修改后的 Acct-Multi-Session-Id 值匹配callstationid 列。
  • 所以我按照你的建议做了: UPDATE radacct set AcctStopTime=('%S'::timestamp - '%{%{Acct-Delay-Time}:-0}'::interval) , AcctTerminateCause='Clear-Stale Session' WHERE UserName='%{User-Name}' and CallingStationId like '%' || '%{Calling-Station-Id}' || '%' 和 AcctStopTime 为 NULL;关闭陈旧的会话,它可以工作。谢谢!

标签: postgresql sql-like freeradius


【解决方案1】:

猜测:

假设 FreeRADIUS 在将 SQL 发送到 PostgreSQL 之前,对整个 SQL 字符串进行了愚蠢的替换,没有尝试解析文字等,那么您可以使用:

SELECT name
FROM users
WHERE city LIKE '%'||'%{variable-name}'||'%';

编辑:为避免 FreeRADIUS 解析不够巧妙导致的警告,请将 %s 隐藏为十六进制字符:

WHERE city LIKE E'\x25%{variable-name}\x25';

注意前面的E 字符串将其标记为要进行转义处理的字符串。

【讨论】:

  • 谢谢,成功了!它引发了关于未知“%”变量警告的两个警告:未知变量“%”:请参阅“doc/variables.txt”警告:未知变量“%”:请参阅“doc/variables.txt”,但它有效!查询正确扩展 UPDATE radacct set AcctStopTime=('2014-07-28 11:38:11'::timestamp - '0'::interval), AcctTerminateCause='Clear-Stale Session' WHERE UserName='cleaver' and CallingStationId like '%' || 'CC-FA-00-C6-4A-A6' || '%' and AcctStopTime is NULL; 并完成工作,清理过时的会话。
  • @StoychoGaenv 查看编辑以了解如何避免警告。
  • 不,这是扩展查询。 UPDATE radacct set AcctStopTime=('2014-07-28 12:20:43'::timestamp - '0'::interval), AcctTerminateCause='Clear-Stale Session' WHERE UserName='cleaver' and CallingStationId LIKE E'x25CC-FA-00-C6-4A-A6x25' and AcctStopTime is NULL 似乎无法解析反斜杠和 query affected rows = 0
  • 愚蠢的东西一定是在消耗反斜杠。双倍。那么请报告针对 freeradius 的所有这些错误。多么可怕的混乱。它应该使用参数化查询。
  • 非常感谢。将反斜杠加倍就可以了。尽管涉及肮脏的黑客攻击,该查询现在正在产生预期的结果。再次感谢!
【解决方案2】:
SELECT name
FROM users
WHERE city LIKE '%%'||'%{variable-name}'||'%%';

稍微干净一些。 %% 是 FreeRADIUS 的百分比转义序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多