小编DeV*_*der的帖子

Perl中的NTLM授权

我正在尝试为用Perl(或者可能是XS模块)编写的Web服务器实现NTLM授权.我的理解是它应该以下列方式工作:

c -> s: GET
s -> c: 401, WWW-Authenticate: NTLM
c -> s: GET, Authorization: NTLM [Type1 Message]
s -> c: 401, WWW-Authenticate: NTLM [Type2 Message]
c -> s: GET, Authorization: NTLM [Type3 Message]

IF s.Check([Type3 Message]):
  s -> c: 200
ELSE:
  s -> c: 401
Run Code Online (Sandbox Code Playgroud)

为了生成Type3消息,我使用了Authen :: Perl :: NTLMAuthen :: NTLM :: HTTP,这两者似乎都可以完美地生成消息,但是,它们没有提供检查Type3消息的功能.

我的下一步是尝试使用Win32 :: IntAuth来验证NTLM令牌.是我遇到麻烦的地方,开发人员和搜索到的其他信息片段说这个模块应该能够验证NTLM二进制令牌.

该模块包含一些Win32 API调用,即AcquireCredntialsHandle,AcceptSecurityContext,CompleteAuthToken和ImpersonateSecurityContext.

不幸的是,我在AcceptSecurityContext上验证NTLM令牌的所有尝试都失败了,SEC_E_INVALID_TOKENSEC_E_INSUFFICIENT_MEMORY导致我建议我的NTLM令牌不正确.下面是一些代码片段,以帮助显示我的方法.

# other code
...
if (not …
Run Code Online (Sandbox Code Playgroud)

perl winapi ntlm sspi

6
推荐指数
1
解决办法
462
查看次数

GC无法在Windows上使用fork-emulation收集内存

首先让我说我没有Perl的深入知识所以请原谅我,如果有一些明显我错过了:)

在我正在查看的系统(在Windows环境中运行)中,我们有一个perl进程,必须下载~5000-6000个文件.由于每个文件都可以独立下载,因此我们为每个文件分叉了不同的线程.线程应该下载文件并死掉.在运行该过程时,我注意到该进程的内存高达~1.7 GB,然后由于每个进程的内存限制而死亡.

在搜索和询问一些人时,我遇到了循环引用的概念,因为垃圾收集器不会释放内存.我搜索了一下,找到了Devel-Cycle可以找出对象中是否有任何循环的包.我得到了这个包并添加了一行来检查进程中的主要对象是否有任何循环.find_cycle为每个线程返回以下语句.

DBD::Oracle::db FIRSTKEY failed: handle 2 is owned by thread 256004 not current thread c0ea29c (handles can't be shared between threads and your driver may need a CLONE method added) at C:/Program Files/Perl/site/lib/Devel/Cycle.pm line 151.
Run Code Online (Sandbox Code Playgroud)

我知道线程之间不能共享DB句柄.我再次查看代码并意识到在fork发生之后,子进程实际上创建了一个新的DB句柄(我想这就是为什么进程仍然继续正常运行直到达到内存限制).我想可能会有更多来自对象中父级的数据库句柄,这些句柄未被子级使用但仍被引用.

我有的Questons -

  1. 循环引用是问题的唯一原因还是会有其他问题导致进程使用如此多的内存?

  2. 共享句柄会导致内存爆炸(换句话说是共享DB句柄导致GC不释放空间)?

  3. 如果它确实是共享数据库句柄,我想我可以说$dbHandle = 0要摆脱引用(如果$dbHabndle引用该特定句柄).我在这里纠正吗?

  4. 我试图通过代码来查看其他地方有对父DB句柄的引用(并找到至少一个更多的引用).有没有其他方法可以做到这一点?有没有方法可以打印出对象的所有属性?

编辑: 并非所有线程(由于Windows中的perl fork调用)同时生成.它产生最多n个线程(其中n是可配置的数字).一旦线程完成执行,该过程就会产生另一个线程.此时n设置为10,但是我将n更改为1(因此一次只运行一个额外的线程),我仍然达到了内存限制.

perl multithreading garbage-collection

2
推荐指数
1
解决办法
139
查看次数

标签 统计

perl ×2

garbage-collection ×1

multithreading ×1

ntlm ×1

sspi ×1

winapi ×1