Система. Данные. OracleClient требует версии 8.1.7 клиентского программного обеспечения Oracle

Внимание: примерный код этого ответа (например, примерный код вопроса) использует расширение PHP mysql, которое устарело в PHP 5.5.0 и полностью удалено в PHP 7.0.0.

Если вы используете последнюю версию PHP, опция mysql_real_escape_string, описанная ниже, больше не будет доступна (хотя mysqli::escape_string является современным эквивалентом). В настоящее время опция mysql_real_escape_string имеет смысл только для устаревшего кода на старой версии PHP.


У вас есть два варианта - экранирование специальных символов в вашем unsafe_variable или использование параметризованный запрос. Оба будут защищать вас от SQL-инъекций. Параметрированный запрос считается лучшей практикой, но для его использования потребуется переходить на более новое расширение mysql в PHP.

Мы рассмотрим нижнюю строку удара, которая будет первой.

//Connect

$unsafe_variable = $_POST["user-input"];
$safe_variable = mysql_real_escape_string($unsafe_variable);

mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

//Disconnect

См. также информацию о функции mysql_real_escape_string .

Чтобы использовать параметризованный запрос, вам нужно использовать MySQLi , а не функции MySQL . Чтобы переписать ваш пример, нам понадобится что-то вроде следующего.

prepare("INSERT INTO table (column) VALUES (?)");

    // TODO check that $stmt creation succeeded

    // "s" means the database expects a string
    $stmt->bind_param("s", $unsafe_variable);

    $stmt->execute();

    $stmt->close();

    $mysqli->close();
?>

Ключевая функция, которую вы хотите прочитать, будет mysqli::prepare .

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

Обратите внимание, что случай вы спросили об этом довольно просто, и что более сложные случаи могут потребовать более сложных подходов. В частности:

  • Если вы хотите изменить структуру SQL на основе пользовательского ввода, параметризованные запросы не помогут, и требуемое экранирование не распространяется на mysql_real_escape_string. В этом случае вам лучше было бы пропускать вход пользователя через белый список, чтобы обеспечить доступ только «безопасных» значений.
  • Если вы используете целые числа от пользовательского ввода в состоянии и берете mysql_real_escape_string, вы столкнетесь с проблемой, описанной в Polynomial в комментариях ниже. Этот случай более сложный, поскольку целые числа не будут окружены кавычками, поэтому вы можете справиться, подтвердив, что пользовательский ввод содержит только цифры.
  • Есть, вероятно, другие случаи, о которых я не знаю. Вы можете найти , этот является полезным ресурсом для некоторых более тонких проблем, с которыми вы можете столкнуться.
42
задан MPelletier 14 May 2012 в 12:43
поделиться

5 ответов

Обновление 1: для различных пользователей возможно иметь различный путь. Но не вероятная проблема здесь. Существует больше шанса, что пользователь, что у iwam пользователя нет разрешения к клиентскому каталогу оракула.

Обновление 0: предполагать для работы. Проверьте на переменную среды (Которые необходимы для нахождения клиента оракула и tnsnames.ora). Кроме того, Возможно, у Вас есть 32/64 бита проблемы. Кроме того, рассмотрите использование Поставщика данных Oracle для.NET (поиск odp.net)

2
ответ дан Igal Serban 26 November 2019 в 23:52
поделиться

Я сталкивался с этой ошибкой десятки раз:

Причина

Права доступа не были правильно установлены, когда клиент Oracle был установлен в Windows с NTFS. В результате содержимое каталога ORACLE_HOME не отображается для прошедших проверку пользователей на машине; это вызывает ошибку, когда System.Data.OracleClient обменивается данными с программным обеспечением Oracle Connectivity из ASP.NET, используя права аутентифицированного пользователя.

Решение

Чтобы решить проблему, вы должны дать аутентифицированному пользователю Группа пользователей имеет права доступа к домашнему каталогу Oracle.

  • Войдите в Windows как пользователь с правами администратора .
  • Запустите проводник Windows и перейдите в папку ORACLE_HOME .
  • Выберите свойства в папке ORACLE_HOME .
  • Щелкните вкладку Безопасность в окне Свойства .
  • Щелкните Authenticated Users элемент в списке Имя .
  • Снимите флажок Чтение и выполнение в списке Разрешения под Разрешить ].
  • Еще раз установите флажок Чтение и выполнение под столбцом Разрешить .
  • Нажмите кнопку Дополнительно и в Записи разрешений подтверждают, что Прошедшие проверку пользователи перечислены с разрешениями: Чтение и выполнение и Применить к: Эта папка, подпапки и файлы . Если не, отредактируйте эту строку и убедитесь, что в раскрывающемся списке Применить к установлено значение Эта папка, подпапки и файлы . Это уже должно быть правильно установлено, но важно, чтобы вы это проверили.
  • Щелкайте кнопку OK, пока не закроете все окна свойств безопасности. Курсор может отображать песочные часы на несколько секунд, поскольку он применяет разрешения, которые вы только что изменили, ко всем подпапкам и файлам.
  • Перезагрузитесь, чтобы убедиться, что изменения вступили в силу.

Попробуйте приложение еще раз.

56
ответ дан 26 November 2019 в 23:52
поделиться

Клиент Oracle версии 11 не может подключиться к базам данных 8i. Вам понадобится клиент версии не более 10.

1
ответ дан 26 November 2019 в 23:52
поделиться

Когда мы сначала отодвинулись к Vista с Oracle 10 г, мы испытали эту проблему, когда мы установили клиент Oracle на наших полях Vista, даже когда мы работали с административными привилегиями во время установки.

Oracle произвела новую версию 10-граммового клиента (10.2.0.3), который был совместимой Vista.

я действительно полагаю, что это было после 11 г был выпущен, таким образом, возможно, что существует 'Vista совместимая' версия для 11 г также.

0
ответ дан Carl 26 November 2019 в 23:52
поделиться

Почему бы не использовать это: dotConnect для Oracle (ранее известный как OraDirect .NET)?

Его можно настроить так, чтобы клиент Oracle вообще не требовался.

Мы использовали это как в службах Windows, так и в веб-службах ASP.NET, и это прекрасно работает.

0
ответ дан 26 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

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