你如何创建一个 table (或其他对象)总是 returns 传递给它的 WHERE 子句的值,就像一面镜子

How can you create a table (or other object) that always returns the value passed to its WHERE-clause, like a mirror

有一个遗留应用程序使用 table 将作业名称转换为文件名。此遗留应用程序查询如下:

SELECT filename FROM aJobTable WHERE jobname = 'myJobName'

但是实际上那些作业名总是匹配文件名(例如'myJobName.job'是作业名也是文件名)这使得这个table显得不必要。但不幸的是,我们无法更改此程序的代码,程序只需要 select 它来自 table.

这实际上有点烦人。因为我们确实需要保持这个数据库同步。如果作业名不在 table 中,则无法使用。所以,作为我们唯一的出路,现在我们有一些 vbscripts 来同步这个 table,为每个可能的文件名添加记录。结果,table 只有 2 列具有相同的值。 -- 我们想摆脱这个。

所以,我们一直梦想着一些黑客 使用作业名称查询数据,但总是再次 returns 作业名称,就像 copy/mirror 查询一样。 然后我们实际上根本不需要填充 table。

“漏洞利用”

可以在此遗留应用程序中配置以下。我的预感是,这些可能会为某些人打开大门 tricks/hacks。

  • 使用 MS Access 或 SQL 服务器(我们更喜欢 sql 服务器)
  • table 的名称(例如 aJobTable
  • 文件名列的名称(例如filename
  • jobname 列的名称(例如 jobname

这是我想出的:

如果我创建一个 table-valued function mirror(a) 那么我就非常接近我想要的了。然后我可以像

一样使用它
SELECT filename FROM mirror('MyJobName.job')

但这还不够好,如果我能强迫它像

SELECT filename FROM mirror WHERE param1 = 'MyJobName.job'

不幸的是,我认为这样调用函数是不可能的。

所以,我想知道是否有人知道如何让它工作。

所以我的问题是:“如何创建一个 table(或其他对象)总是 returns 传递给它的 WHERE 子句的值,就像一面镜子."

不知道应用程序使用的代码很难回答,但如果我们假设它只接受字符串并在没有任何测试的情况下连接它们,我会假设代码如下:(翻译成 c#)

var sql = "SELECT "+ field +" FROM "+ table +" WHERE "+ conditionColumn +" = '"+ searchValue +"'";

因为这是 SQL 注入的大门,并且鉴于 SQL 服务器允许您通过两种方式创建别名 - value as aliasalias = value , 您可以利用它并尝试生成一个 SQL 语句,如下所示:

SELECT field /* FROM table WHERE conditionColumn */ = 'searchValue' 

所以字段应该是 "field /* ",
conditionColumn 应该是 "conditionColumn */"

table 名称无所谓,你可以留空字符串。