我正在使用从 Linux Apache 2.x 主机到 SQL Server 的 ODBTP 接口。mod_dbm 不支持这一点,我需要能够将代码移动到任何支持 Apache 的主机。
关于我的环境的说明:我使用的是 Apache 2.2.17、用 C 包装的 C++ for Apache、ODBTP 1.14、SQL Server 2008。
我已经成功实现了 ODBTP 连接,并且我能够充分使用模块本身中的数据,但我希望保持连接而不是持续连接、断开连接,然后重新开始使用本地 HTTP 调用来检索数据的应用程序以 JSON 格式。
问题是我需要在我不信任纯文本编写应用程序的安全性的环境中部署此应用程序和模块,以安全地保护数据库凭据。当应用程序通过 HTTP 连接时,它只提供我的模块在发送到数据库之前解密的加密凭据。
我目前正在为数据库创建一个句柄并将其存储在模块定义中的键控 apr_hash_t 表中。应用程序连接后,模块会查找应用程序在 URL 中指定的每个请求的唯一令牌,以查找该应用程序的连接。这有效,但只有一次。
哈希键是 32 位键,最初是从池中创建的 char *,并与 ODBTP 句柄一起存储为哈希表中的一行。不知何故,调用之间的密钥正在被修改,原始密钥现在是一个截断的版本。
示例:1)我从我的应用程序中拨打 1 次电话以启动持久连接。这行得通。2)我从我的应用程序中进行了 3 次背靠背调用以执行 sql 字符串。(/stars/execute_sql/unique/<>/sql/<>) x 3
第一个电话很完美,我检索了数据。下一次调用保存为密钥的令牌被截断,模块找不到关联的密钥。下一次调用令牌处于与尝试 2 相同的截断状态。
我不确定我是否正在覆盖内存?我写了一个简短的循环函数来吐出哈希表的内容,这样我就可以在我的代码中的每个点都粘贴这个函数来找出数据可能被破坏的地方,但我的发现没有任何意义。我必须拆分 uri 才能找到嵌入在 uri 中的数据。我在这个函数中跟踪内存转移到一行,如“raw = apr_psprintf(apache->pool,"%s", subject);" 在下面的代码中。
void theRequest::get_exploded_str(char *subject, char *delimiter)
{
// variables
char *raw, *next, *last;
// create the split chars database if not created
loadSDB();
apr_array_clear(x_split_chars);
subject = apr_pstrndup(apache->pool, subject, string(subject).length());
raw = apr_psprintf(apache->pool,"%s", subject);
next = (char*)apr_strtok(raw, delimiter, &last);
while (next)
{
// add next to array
*(char **) apr_array_push(x_split_chars) = apr_pstrdup(apache->pool, next);
// fetch next
next = (char*)apr_strtok(NULL, delimiter, &last);
}
return;
};
它在通话 1 上完美运行,但在通话 2 上却不行,因为密钥正在以某种方式移动。
有任何想法吗?甚至是关于如何使用 APR_RESLIST 更好地完成此任务的一些想法?
提前致谢!