【问题标题】:Is there a way to utilize an Oracle wallet via PHP on windows?有没有办法在 Windows 上通过 PHP 使用 Oracle 钱包?
【发布时间】:2021-03-16 20:40:05
【问题描述】:

我有一个 PHP 代码库,它驻留在连接到 Oracle 数据库的 Windows 服务器上。我的数据库正在迁移到云设置中的 Oracle,这需要我们使用 Oracle 钱包进行连接。

我得到了钱包的设置,并且可以通过实用程序进行连接,但到目前为止,我的所有研究都让我使用了带有 OCI_CRED_EXT 的 session_mode 的 oci_connect()。但是 PHP 的 oci_connect (https://www.php.net/manual/en/function.oci-connect.php) 声明“出于安全原因,Windows 不支持 OCI_CRED_EXT。”。

有没有办法在 Windows 上通过 PHP 使用 Oracle 钱包?

【问题讨论】:

  • 它似乎在 Windows 中根本不起作用。仅限 Unix。
  • 已知的“功能”;我会把它添加到我的待办事项列表中。我理解技术(安全)限制应该不再是问题,但这需要一些审查。代码更改为 likely to be minimal,可能会将该代码替换为对最低 Oracle 客户端库的要求。
  • Christopher,我承认我期待很多“它行不通,使用 unix/linux”,但你的回答让我措手不及。我很欣赏令人鼓舞的反应,这让我的下午变得更加明亮。我希望您和您的家人在这些艰难时期保持安全和理智。
  • 在下面查看我的答案:我现在假设您在 Oracle 的云中并且不需要外部身份验证。

标签: php database windows oracle


【解决方案1】:

Oracle 云钱包提供双向 TLS 以确保安全,但您仍需要传递数据库用户名和密码。因此,您不使用外部身份验证。

您只需要确保 Oracle Net 可以找到钱包,或者使用下面使用的Easy Connect Plus 语法(wallet_location 是包含 cwallet.sso 文件的目录),或者通过编辑 sqlnet.ora(或将它在默认位置)。见How to connect to Oracle Autonomous Cloud Databases

适合我的代码是:

<?php

error_reporting(E_ALL);
ini_set('display_errors', 'On');

$c = oci_connect('cj', 'topsecret', 'tcps://adb.ap-melbourne-1.oraclecloud.com:1522/xxxxxx.adb.oraclecloud.com?wallet_location=/Users/cjones/Cloud/alwaysfree/CJDBMELB');

if (!$c) {
    $m = oci_error();
    trigger_error('Could not connect to database: '. $m['message'], E_USER_ERROR);
}

$s = oci_parse($c, "select * from dual");
if (!$s) {
    $m = oci_error($c);
    trigger_error('Could not parse statement: '. $m['message'], E_USER_ERROR);
}

$r = oci_execute($s);
if (!$r) {
    $m = oci_error($s);
    trigger_error('Could not execute statement: '. $m['message'], E_USER_ERROR);
}

while (($row = oci_fetch_array($s, OCI_ASSOC+OCI_RETURN_NULLS)) != false) {
    echo "<tr>\n";
    foreach ($row as $item) {
        echo "<td>";
        echo $item!==null?htmlspecialchars($item, ENT_QUOTES|ENT_SUBSTITUTE):"&nbsp;";
        echo "</td>\n";
    }
    echo "</tr>\n";
}
echo "</table>\n";

?>

【讨论】:

  • 云解决方案中的 Oracle 来自第三方供应商,我们被告知我们无法直接访问我们的密码,但可以访问存储密码的钱包证书。在第一次会议上,他们远程访问了我们的一个开发服务器并安装了一个钱包。我可以使用命令行工具建立连接,但是由于调用中的 OCI_CRED_EXT 标志,php 拒绝了。如果凭据在钱包中并且我在调用中提供了不同的密码,它会炸毁还是忽略提供的密码以支持存储?我明天得试试。
猜你喜欢
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多