Обработка ошибок с помощью кода защиты от инъекций SQL [дубликат]

Посмотрите файл setup.py пакета, который вы пытаетесь установить. Если это более старый пакет, он может импортировать distutils.core.setup(), а не setuptools.setup().

Я столкнулся с этим (в 2015 году) с комбинацией этих факторов:

  1. Компилятор Microsoft Visual C ++ для Python 2.7 из http://aka.ms/vcpython27
  2. Более старый пакет, в котором используется distutils.core.setup()
  3. сделать python setup.py build, а не использовать pip.

Если вы используете недавнюю версию pip, она заставит (monkeypatch) пакет использовать setuptools, даже если его setup.py призывает к distutils. Однако, если вы не используете pip и вместо этого выполняете python setup.py build, процесс сборки будет использовать distutils.core.setup(), который не знает о месте установки компилятора.


Решение

Шаг 1. Откройте соответствующую командную строку Visual C ++ 2008

Откройте меню «Пуск» или «Начало» и выполните поиск «32-разрядной командной строки Visual C ++ 2008» (если ваш питон 32 -бит) или «64-битная командная строка Visual C ++ 2008» (если ваш питон 64-разрядный). Запустить его. Командная строка должна указывать Visual C ++ 2008 ... в строке заголовка.

Шаг 2: Установите переменные среды

Установите эти переменные среды в только что открывшейся командной строке.

SET DISTUTILS_USE_SDK=1
SET MSSdk=1

Ссылка http://bugs.python.org/issue23246

Шаг 3: Сборка и установка

cd к пакету, который вы хотите построить, и запустите python setup.py build, затем python setup.py install. Если вы хотите установить в virtualenv, активируйте его перед сборкой.

47
задан outis 3 July 2012 в 19:15
поделиться

2 ответа

Короткий ответ на ваш вопрос - «нет».

В строгом смысле, на уровне базы данных подготовленные операторы позволяют привязывать параметры только к битам «values» инструкции SQL.

. Один из способов думать об этом - «вещи, которые можно заменить во время выполнения инструкции без изменения ее значения». Имя (и) таблицы не является одним из этих значений времени выполнения, поскольку оно определяет правильность самого оператора SQL (то есть, какие имена столбцов являются допустимыми) и изменение его во время выполнения потенциально может изменить, является ли оператор SQL действительным.

На немного более высоком уровне даже в интерфейсах базы данных, которые эмулируют подстановку подготовленного оператора, а не фактически посылают подготовленные операторы в базу данных, такие как PDO, которые могли бы позволить вам использовать местозаполнитель в любом месте (поскольку placeholder заменяется перед отправкой в ​​базу данных в этих системах), значение заполнителя таблицы будет строкой и вложено как таковое в SQL, отправленное в базу данных, поэтому SELECT * FROM ? с mytable в качестве параметра на самом деле заканчивается (f4) в базу данных, которая является недопустимой SQL.

Лучше всего продолжать работу с

SELECT * FROM {$mytable}

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

62
ответ дан Sam Graham 25 August 2018 в 07:26
поделиться

В конце концов, я получаю прекрасный ответ. как написать имя таблицы в инструкции подготовки динамически. все трюки происходят с '{}'. вы должны использовать свою переменную внутри этого '{}'. он работает в моем коде.

$tablename = "run_time_variable";     
$stmt = $conn->prepare("INSERT INTO `{$tablename}` (name, address, phone ) VALUES (?,?,?)");
$stmt->bind_param("sss", $name, $address, $phone );
$stmt->execute();
-4
ответ дан lotus weaver 25 August 2018 в 07:26
поделиться
Другие вопросы по тегам:

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