Невозможно получить имена столбцов базы данных

Вам нужно понять разницу между динамической типизацией и статической типизацией . У индексатора для вашего объекта worksheet, скорее всего, есть статический тип object.

public object this[string cell]{get{...}set{...}}

Поскольку все объекты в C # наследуют от типа object, объект ссылка, хранящаяся в ячейке, может быть ссылкой на любой объект .

То есть, поскольку делегат (например, Func) является object, он может быть сохранен в object ссылке:

Func func = ()=>return "foo";
object o = func; // this compiles fine

И компилятор может понять все это, потому что он неявно понимает, что производный класс может быть сохранен в ссылке на базовый класс.

То, что компилятор не может сделать автоматически, определяет тип динамического типа или тип времени выполнения объекта.

Func func = ()=>return "foo";
object o = func; // this compiles fine
func = o; // <-- ERROR

Компилятор не знает, что object, хранящийся в o, действительно имеет тип Func. Это не должно отслеживать это. Это информация, которая должна быть проверена во время выполнения.

func = (Func)o; // ok!

Вышеприведенная строка кода компилируется во что-то, что ведет себя аналогично этому:

if(o == null)
    func = null;
else if(typeof(Func).IsAssignableFrom(func.GetType()))
    __copy_reference_address__(func, o); // made up function!  demonstration only
else throw new InvalidCastException();

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

0
задан melpomene 1 March 2019 в 21:55
поделиться

1 ответ

В любом запросе UNION количество столбцов должно быть одинаковым в каждом SELECT, который вы объединяете с UNION. Другими словами, следующее является ошибкой, поскольку число столбцов не одинаково:

SELECT a, b, c FROM table1
UNION 
SELECT a, b FROM table1

При выполнении SQL-инъекции вы можете не знать количество столбцов в списке выбора запроса ты эксплуатируешь. Добавьте больше столбцов с NULL по мере необходимости. Просто продолжайте пытаться, пока не получите что-то успешное.

SELECT * FROM drinks WHERE drinkname='smirnoff' 
UNION 
SELECT COLUMN_NAME, NULL, NULL, NULL, ...
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'drinks'

Это может показаться утомительным и подверженным ошибкам.

Но преступники, которые совершают атаки SQL-инъекций, довольно мотивированы.

0
ответ дан Bill Karwin 1 March 2019 в 21:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: