人
我在试图解决这个问题时遇到了很多麻烦。
情景:
在工作中,我们使用漏洞管理工具QualysGuard。 除了所有技术细节之外,该工具基本上可以检测所有服务器中的漏洞,并为每个服务器中的每个漏洞创建一个故障单号。 在UI中,我可以访问所有这些票证并下载包含所有这些票证的CSV文件。 另一种方法是使用API。 API使用一些cURL调用来访问数据库并检索我在参数中指定的信息。
方法:
我正在使用这样的脚本来获取数据:
<?php
$username="myUserName";
$password="myPassword";
$proxy= "myProxy";
$proxyauth = 'myProxyUser:myProxyPassword';
$url="https://qualysapi.qualys.com/msp/ticket_list.php?"; //This is the official script, provided by Qualys, for doing this task.
$postdata = "show_vuln_details=0&SINCE_TICKET_NUMBER=1&CURRENT_STATE=Open&ASSET_GROUPS=All";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_PROXY, $proxy);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyauth);
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_POST, 1);
$result = curl_exec ($ch);
$xml = simplexml_load_string($result);
?>
上面的脚本运行正常。它连接到API,将一些参数传递给它,ticket_list.php
文件生成一个XML文件,我只需要它。
问题:
1 - )此脚本仅允许在其返回的XML文件中限制1000个结果。 如果我的请求生成了超过1000个结果,那么脚本会在XML的末尾创建一个这样的TAG:
<TRUNCATION last="5066">Truncated after 1000 records</TRUNCATION>
在这种情况下,我需要执行anoter cURL调用,参数如下:
$postdata = "show_vuln_details=0&SINCE_TICKET_NUMBER=5066&CURRENT_STATE=Open&ASSET_GROUPS=All";
2 - ) Qualys的数据库(云)中有大约300,000张门票,我需要下载所有这些门票并插入MY数据库,我的应用程序使用它创建。此应用程序有一些表单,由用户填写,并对数据库运行一堆查询。
怀疑: 对我来说,完成上述任务的最佳方式是什么? 我有一些想法,但我完全失去了。 我想:
** 1 - )**创建一个执行上述调用的函数,解析xml和标签
TRUNCATION
存在,它获取其值并再次调用自身,递归执行,直到没有标记TRUNCATION
的结果出现。
这个问题是我无法合并每个调用的XML结果,我不确定它是否会导致内存问题,因为它需要近300个cURL调用。该脚本将在非业务时段使用服务器的cronTab自动执行。
2 - )我将我提到的表单发布到脚本并使用用户{{1}的参数进行cURL调用,而不是检索所有数据。 }编辑。但是我再次确定这是不是很好,因为我仍然需要进行多次调用,具体取决于用户发送的参数。
3-)这是一个疯狂的事情:在我登录用户界面时使用某种宏软件录制我,转到门票所在的页面,点击下载按钮,检查CSV选项,然后再次单击下载。然后,将此脚本导出为某种语言(如python或java),在cronTab中创建一个任务,并创建一个解析下载的CSV并将数据插入数据库的脚本。 (疯狂与否?= P)
任何帮助都是非常受欢迎的,也许答案就在我的眼前,我还没有得到。 提前谢谢!
答案 0 :(得分:0)
我认为正确的方法会涉及队列工作者,但是,如果我是你,我会让你的脚本在一次执行中抓取其中的5个XML文件 - 插入行,从内存中删除,重复。然后,我通过手动运行几次来测试它,看看它需要什么样的执行时间和内存。一旦你对执行时间有了一个很好的了解,并且你可以看到内存不会成为问题,那么在一段时间内安排一个不到两倍的cron。如果一切顺利,它应该在运行之间大约一分钟,你可以在一小时内将它全部放在你的数据库中。