我想创建一个小工具,如CRLF Injection或HTTP header respons splitting。我成功创建了数千个NetData模式(数据有效载荷)列表。像这个例子的NetData模式:
GET http://somebug.com/ HTTP/1.1[CRLF]Host : somehost.com[CRLF]GET somesite.com HTTP/1.1[CRLF][CRLF]
GET http://somebug.com/ HTTP/1.1[CRLF]Host : somehost.com[CRLF][CRLF]GET somesitesite.com HTTP/1.1[CRLF][CRLF]
HEAD http://somebug.com/ HTTP/1.1[CRLF]Host : somehost.com[CRLF]CONNECT somesitesite.com HTTP/1.0[CRLF][CRLF][CRLF][CRLF]
...
如果只有一个数据模式/数据有效负载,我可以编写如下示例代码:
procedure T_CRLFTest.IdMappedPortTCP1Execute(AContext: TIdContext);
begin
if(Pos('CONNECT',TIdMappedPortContext(AContext).NetData)<>0) then
TIdMappedPortContext(AContext).NetData := 'GET http://somebug.com/ HTTP/1.1'#13#10'Host : somehost.com'#13#10+TIdMappedPortContext(AContext).NetData+#13#10#13#10
end;
问题是,如何使用IdMappedPortTCP
多线程技术测试所有数据模式超过20,000个列表?
我正在使用Delphi 2007
和Indy 10
。
答案 0 :(得分:2)
NetData
包含OnExecute
事件被触发时套接字上可用的原始数据。对于事件的任何触发,无法保证NetData
的内容。因此,每次触发事件时,您都需要将该数据存储到您自己的每个连接缓冲区中,然后您可以解析该缓冲区以查找完整的行并根据需要进行调整,然后使用新数据更新NetData
如所须。当事件处理程序退出时,NetData
中的任何数据都是传递给目标服务器的数据。
BTW,HEAD http://somebug.com/ HTTP/1.1[CRLF]Host : somehost.com[CRLF]CONNECT somesitesite.com HTTP/1.0[CRLF][CRLF][CRLF][CRLF]
是两个相互重叠的HTTP命令。这绝不应该发生在真实场景中。如果是,则发送这些命令的客户端有问题。