问题标签 [dbi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
420 浏览

windows - 是使用 Perl DBI 模块还是设置系统 DSN 并使用 ODBC 更好?

我正在使用 Perl 从多个日志文件中收集数据并将其存储到我正在运行脚本的同一 Windows 2003 主机上的 Oracle 数据库中。是使用 Perl DBI 模块还是设置系统 DSN 并使用 ODBC 更好?

0 投票
3 回答
2556 浏览

sql-server - 如何保护从 Perl DBI 到 SQL Server 的连接?

我需要使用 Perl DBI 连接到安全的 SQL Server 数据库。我需要找到一种方法来安全地验证用户身份(不用担心被窃听,也不需要在客户端存储密码)。我SQL Server 2008Windows Server 2008, and Perl 5.10XP上使用。

SQL Server 通过称为“SQL Server Native Access Client API”的东西支持加密连接,但我不知道这是否被任何 DBD 驱动程序支持,或者如果它是如何使用它。

我不愿意将DBD::ODBC驱动程序与 SQL Server 身份验证一起使用,因为 ODBC 以明文形式传输用户 ID 和密码。

我不能将 DBD::ODBC 驱动程序与 Windows 身份验证(可信连接)一起使用,因为服务器不在任何可从客户端网络访问的 Active Directory 域中。

如何保护与数据库的连接?谢谢。

0 投票
1 回答
5106 浏览

perl - 是否可以使用 DBD::Oracle 在单个查询中执行多个语句?

我想知道是否可以在单个语句中执行多个 SQL 语句execute()do()使用DBD::Oraclevia Perl调用DBI。例子:

我问这个不是因为我想真正做这样的事情,而是因为我想通过成功的 SQL 注入攻击来衡量可能造成的损害。是的,我知道,不管这个问题的答案如何,仍然必须从根本上消除 SQL 注入的可能性,只使用绑定值和受信任的输入等。但问题仍然存在:是否可以DBD::Oracle执行多个陈述?

作为一个相关示例,DBD::mysql有一个mysql_multi_statements明确启用此“功能”的连接选项。我无法摆脱这样一种感觉,即有一些类似的、可能是未记录的和晦涩的 Oracle OCI 选项可以通过它以某种方式访问DBD::Oracle​​,从而实现相同的功能。

万一这很重要,这是:

  • perl5.8.8
  • DBD::Oracle1.22
  • 甲骨文 11g (11.01.0700)
0 投票
3 回答
1936 浏览

perl - 如何重构使用带有 DBI 的模板工具包的 Perl 代码以利用 FastCGI?

背景

下面是一段典型的 Perl 代码(用于讨论的sample.pl),它使用 CGI 抓取提交的表单数据,将表单数据传递给 DBI,然后 DBI 从 MySQL 检索所需的行,然后将结果传递给 Template Toolkit呈现为 HTML 文档以供显示。

sample.pl的代码清单:

为了获得更好的性能和可扩展性,提供共享服务器的 Web 主机(例如 Dreamhost)强烈建议所有生产 Perl 脚本都支持 FastCGI。FastCGI 文档非常清楚如何修改现有的 Perl 代码以支持 FastCGI。下面的简单代码通常作为示例给出:

不太清楚的是在 while 循环中放置的位置和内容。

子问题

A. sample.pl 中的代码是否应该像这样简单地包裹现有代码:

B. 或者还有更多内容?例如,处理 cgi、数据库和模板的代码是否应该重构为它们自己的子程序?

C. DBI->connect() 和 $db_handle->disconnect() 应该在 FCGI while 循环内部还是外部调用?对性能有何影响?

D. 应该在 FCGI while 循环内部还是外部调用 $tt->process()?

0 投票
2 回答
6381 浏览

perl - 如何使用 Perl DBI 在 Oracle 中超时“选择更新”

有没有一种简单的方法可以让 SQL 语句超时,这样它就会失败而不是等待(例如,传递一个空的结果集或错误消息或其他任何东西),这样我就可以让一个作业的资源预留失败并给另一个机会?我正在寻找迄今为止我忽略的一些 DBI 选项;向自己发送 SIGALRM 以自杀并不是我的想法(尽管如果必须的话,我可能不得不求助于那个)。

被剪断的代码是伪代码并被缩短到了极点,但我希望你能明白其中的意思。

以下是有兴趣的血腥细节:

在进行大规模并行数字运算的应用程序中,有一个使用 oracle 表实现的资源锁定机制。每个作业都需要锁定多个读取资源和/或写入多个资源,并且只有在成功获取所有锁后才能启动。与其耐心等待资源被释放,不如让作业失败并稍后由它们的主人重新运行(这可以保持打开事务的数量较低,同时通过在实际紧缩时提供更多作业来提高性能)。

当然,在实际更新表之前,每行都使用“SELECT ... FOR UPDATE”语句保留,因此 Oracle 使用行级锁定,并发事务可以在表上发生。为了进一步减少可能的竞争条件和死锁,所有作业首先选择它们的资源行,然后在执行更新之前使用相同的顺序对它们进行行锁定。

截至目前的实施,这在大多数情况下都可以正常工作。但是,因为在 Oracle 实际授予行锁之前“选择更新”会阻塞,因此可能仍然会发生作业空闲等待其资源的情况,而我正在寻找这些以更好地利用可用的 CPU 能力。等待一两秒钟是可以的,但不是十秒钟或更长时间只是为了锁定。稍后解锁,当然需要等待,因此将整个数据库连接设置为只接受即时结果是行不通的。

我总是感谢RTFM的答案,只要它们指向M中我应该TFR的位置;-))

非常感谢,
奥尔凡

0 投票
6 回答
27133 浏览

perl - 如何使用 Perl 的 DBI 处理 unicode?

我的delicious-to-wp perl 脚本有效,但为所有“怪异”字符提供了更怪异的输出。所以我尝试了

但这并没有什么不同。我希望例如“上线”变成“上线”而不是“上线” 我如何在 Perl 中处理 unicode 以使其正常工作?

更新:我发现问题是设置 DBI 的 utf 我必须在 Perl 中设置:

那是我必须设置的部分,很棘手。谢谢!

0 投票
2 回答
556 浏览

perl - 防止 SQL 表名注入 - 多远?

我正在开发一个相对较小的应用程序来与 PostgreSQL 对话,并希望获得一些反馈,说明在防止 SQL 注入方面还有多远。

该应用程序在 Perl 中,不使用任何 ORM 模块(仅 DBI)。SQL 语句是用占位符以典型方式构造的:

插入表名的原因是应用程序必须对多个表执行相同的操作,所有表都有一个列“foo”。

使用 ?占位符可防止大多数简单的 SQL 注入攻击。我的问题是关于表名,你不能使用占位符。该表来自配置文件,但应用程序支持 --configfile 开关以使用备用配置文件。

数据库凭据存储在配置文件中。因此,如果攻击者可以使用 $cfg->{tablename} 替换为恶意内容的配置文件(或替换默认文件),则可能会“诱骗”应用程序运行恶意代码。

对于攻击者来说,他们必须已经拥有有效的数据库凭据,否则应用程序将无法连接。如果他们有凭据,那么他们可以使用 DBI 编写自己的代码或使用 psql cli 执行恶意操作。

我看到了两种可能的方法来防止这种情况:

  • 切换到 ORM,在这种情况下,我会按照 $orm->get_class_for_table($cfg->{tablename}
  • 在准备 SQL 语句之前使用正则表达式清理表名
  • 使用 $dbh->quote_identifier()

显然第二种方式是“便宜又快乐”的方式。但是鉴于上面关于凭据的声明,这些方法中的任何一种真的有必要吗?在迫使攻击者只使用备用攻击向量(与实际阻止攻击的努力相反?

0 投票
1 回答
2913 浏览

perl - 为什么我不能通过 Perl 通过 JSON::XS 正确编码来自 PostgreSQL 的布尔值?

我在返回布尔值的 PostgreSQL 系统上有一个查询:

根据DBD::Pg 文档

PostgreSQL 的当前实现返回 't' 为真,'f' 为假。从 Perl 的角度来看,这是一个相当不幸的选择。因此,DBD::Pg 以 Perlish 方式转换 BOOL 数据类型的结果:“f”变成数字 0,“t”变成数字 1。这样应用程序就不必检查特定于数据库的返回值BOOL 数据类型,因为 Perl 将 0 视为假,将 1 视为真。如果您愿意,您可以将 pg_bool_tf 属性设置为真值以将值更改回“t”和“f”。

因此,只要 pg_bool_tf 返回 0,它就会返回 0,它会返回 0。然而,在 JSON::XS(和纯 JSON)的某个地方,将返回的 0 解释为字符串:

...死于:

{"layout":0,"show_widget_help":"0"}

...这很好,除了我的 JavaScript 期望那里有一个布尔值,并且非空字符串“0”被评估为真。为什么后面的 0 被引用而前者不被引用?

根据JSON::XS docs,这是一个主要功能:

往返完整性

当您仅使用 JSON 支持的数据类型序列化 perl 数据结构时,反序列化的数据结构在 Perl 级别上是相同的。(例如字符串“2.0”不会因为它看起来像一个数字而突然变成“2”)。有一些例外情况,请阅读下面的映射部分以了解这些情况。

...它说:

简单的 Perl 标量(任何不是引用的标量)是最难编码的对象:JSON::XS 会将未定义的标量编码为 JSON 空值、在编码为 JSON 字符串之前最后在字符串上下文中使用的标量,以及其他任何数值。

但我从不在字符串上下文中使用@vals[0]。也许 DBD::Pg 在返回它之前使用它的布尔值 0 作为字符串?

0 投票
3 回答
897 浏览

sql-server - 修剪数组(通过 DBI 填充)

我正在尝试使用 Perl 和 DBI 模块从 SQL Server 数据库中读取数据。我的意图是读取数据并将其打印到文本文件中(逗号分隔)。当我这样做时,我得到这样的结果:

所以第二个变量数据和逗号之间有一个空格。我尝试使用下面的代码对其进行修整,但没有奏效。我应该如何修改我的代码以摆脱那些空格?

我的代码在这里:

0 投票
5 回答
14640 浏览

perl - 为什么 DBD::SQLite 不能通过我的 Perl CGI 脚本插入数据库?

我在DBD::SQLite正在访问的 Perl CGI 脚本中运行 SQLite 数据库。这是在 Apache 上作为直接 CGI 运行的。

DBI 连接工作正常,并且可以运行选择。但是,当我尝试插入时,我得到一个带有以下错误的模具:

我已尝试将数据库文件权限更改为 666 以尝试解决此问题,但我仍然收到错误消息。

有什么建议吗?