Как вы можете создать таблицу (или другой объект), которая всегда возвращает значение, переданное в ее предложение WHERE, например зеркало?

Существует устаревшее приложение, которое использует таблицу для преобразования имен заданий в имена файлов. Это устаревшее приложение запрашивает его следующим образом:

SELECT filename FROM aJobTable WHERE jobname = 'myJobName'

Но на самом деле эти имена заданий всегда совпадают с именами файлов (например, «myJobName.job» — это имя задания, но также и имя файла). Из-за этого эта таблица кажется ненужной. Но, к сожалению, мы не можем изменить код этой программы, а программе достаточно выбрать его из таблицы.

Это на самом деле немного раздражает. Потому что нам нужно синхронизировать эту базу данных. Если имя задания отсутствует в таблице, его нельзя использовать. Так что, как наш единственный выход, прямо сейчас у нас есть несколько vbscripts для синхронизации этой таблицы, добавляя записи для каждого возможного имени файла. В итоге в таблице всего 2 столбца с одинаковыми значениями. -- Мы хотим избавиться от этого.

Итак, мы мечтали о каком-нибудь хаке, который запрашивает данные с именем задания, но просто всегда возвращает имя задания снова, как запрос копирования/зеркала. Тогда нам на самом деле не нужно заполнять таблицу вообще.

Подвиги

Следующие можно настроить в этом устаревшем приложении. Я подозреваю, что это может открыть дверь для некоторых трюков/хаков.

  • использование либо MS Access, либо SQL Server (мы предпочитаем sql server)
  • Имя таблицы (например, aJobTable)
  • Имя столбца имени файла (например, filename)
  • Имя столбца имени задания (например, jobname)

Вот что я придумал:

Если я создам функция с табличным значением mirror(a), то я довольно близко подхожу к тому, что хочу. Тогда я мог бы использовать его как

SELECT filename FROM mirror('MyJobName.job')

Но этого недостаточно, было бы, если бы я мог заставить его быть таким

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

К сожалению, я не думаю, что можно вызывать такие функции.

Итак, мне было интересно, может быть, кто-то еще знает, как заставить его работать.

Итак, мой вопрос: Как вы можете создать таблицу (или другой объект), которая всегда возвращает значение, переданное в ее предложение WHERE, например зеркало.


person bvdb    schedule 13.11.2018    source источник
comment
Я не думаю, что вы можете прочитать/получить значение предложения WHERE в любом объекте. Я понимаю проблему, но иногда (и я делаю это снова и снова) лучше всего потратить время на переписывание унаследованного кода.   -  person gotqn    schedule 13.11.2018
comment
пожалуйста, попробуйте SELECT @jobname as Filename   -  person Sanal Sunny    schedule 13.11.2018
comment
Итак, приложение создает SQL-запрос и отправляет его в соответствующую базу данных в виде строки, это правильно?   -  person Zohar Peled    schedule 13.11.2018
comment
Вы говорите, что приложение всегда придумывает строку формы select A from B where C = 'D'. Если он просто объединяет его, а не параметризует, вы можете попробовать SQL-инъекцию.   -  person Nick.McDermaid    schedule 13.11.2018
comment
Например select Dummyfield1 from EmptyTable where Dummyfield2 = '' UNION ALL SELECT 'The Real Value';   -  person Nick.McDermaid    schedule 13.11.2018
comment
@ Зохар Пелед это правильно   -  person bvdb    schedule 13.11.2018
comment
@Nick.McDermaid, это хорошая идея! - Я попробую это   -  person bvdb    schedule 13.11.2018
comment
Конечно, если он подвержен SQL-инъекциям, это еще одна причина для его замены.   -  person Nick.McDermaid    schedule 13.11.2018
comment
@Nick.McDermaid Это приложение, написанное в 90-х годах, взаимодействует с десятком старых промышленных принтеров (таких, которые печатают сроки годности на потребительских товарах). Он работает в изолированной сети, недоступной для Интернета. Исходный код недоступен. У него нет веб-интерфейса. И его инструмент настройки защищен паролем. И есть по крайней мере дюжина наших клиентов, которые имеют подобные настройки. Их трудно устранить/заменить, потому что это будет дорого и часто будет иметь скрытые настройки. Устранение этой базы данных доступа было бы большим шагом. ;-)   -  person bvdb    schedule 13.11.2018
comment
Почему бы не определить столбец filename как (виртуальный) вычисляемый столбец, возвращающий значение jobname?   -  person a_horse_with_no_name    schedule 13.11.2018


Ответы (1)


Довольно сложно ответить, не зная кода, который использует приложение, но если мы предположим, что оно принимает только строки и объединяет их без каких-либо тестов, я бы предположил такой код: (переведенный на С#)

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

Поскольку это открытая дверь для SQL-инъекций, и учитывая тот факт, что SQL Server позволяет вам создавать псевдонимы двумя способами — value as alias и alias = value, вы можете воспользоваться этим и попытаться сгенерировать оператор SQL следующим образом:

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

Таким образом, поле должно быть "field /* ",
и conditionColumn должно быть "conditionColumn */"

имя таблицы не имеет значения, для него можно оставить пустую строку.

person Zohar Peled    schedule 13.11.2018
comment
Похоже, это лучшая идея на данный момент. - person bvdb; 13.11.2018
comment
Это зависит от нескольких предположений, но, зная, как мы писали код в то время, это может быть именно так и, следовательно, самое простое решение. - person Zohar Peled; 13.11.2018
comment
Если подумать, conditionColumn вполне может быть "*/".... - person Zohar Peled; 13.11.2018
comment
Мне любопытно узнать, работает ли это. Не могли бы вы протестировать его и оставить комментарий? - person Zohar Peled; 14.11.2018
comment
Не получилось, но было близко. Я думаю, причина в том, что результирующий оператор sql, вероятно, похож на SELECT * FROM table WHERE */ = 'searchValue', а затем имя поля используется для извлечения данных из набора результатов. О, это была хорошая попытка. Я думаю, что это так близко, как я когда-либо получить. - Отличная работа. - По крайней мере, я узнал пару вещей о SQL-инъекциях, спасибо. - person bvdb; 14.11.2018
comment
можете ли вы запустить профилировщик на SQL Server, чтобы получить запрос, который действительно выполняется? потому что, если вы можете, это может помочь вам решить, действительно ли вы можете использовать трюки SQL-инъекций для решения этой проблемы. - person Zohar Peled; 14.11.2018