我们在工作中安装了 Drupal7 的 MU(多站点),并试图暂时阻止我们收到的大量机器人,直到我们有机会加载我们的内容。如果我们在 Xpath 中找到某个标准,我编写了一个快速而肮脏的脚本来发送 503 标头(如果没有形成 DOM,这也可以作为 strpos/preg_match 完成)。
为了让球滚动,虽然我需要弄清楚如何
A) 劫持 Drupal7 引导程序并通过下面的过滤器提取所有内容
b) 在内容加载之前通过过滤器的 ob_flush 内容
值得一提的是我们使用了一个称为域访问的模块,我相信它首先让我开始了这场疯狂的追逐。我知道一个事实,它混淆了很多文件......
我遇到的问题是弄清楚我可以在哪里捕捉内容?应该可以将流推送到一个变量中,strpos它,然后释放它,对吗?我认为 Drupal7 中的 index.php 可能是嫌疑人,但我对应该在哪里或如何捕获内容有点困惑。这是脚本,希望有人能指出我正确的方向。
//error_reporting(-1);
/* start query */
$dom = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->Load($_SERVER['PHP_SELF']);
$xpath = new DOMXPath($dom);
//if this exists we aren't ready to be read by bots
$query = $xpath->query(".//*[@id='block-views-about-this-site-block']/div/div/div");
//or $query = 'klat-badge'; //if this is a string not DOM
/* end query */
if(strpos($query) !== false) {
//require banlist
require('botlist.php');
$str = strtolower('/'.implode('|', array_unique($list)).'/i');
if(preg_match($str, strtolower($_SERVER['HTTP_USER_AGENT']))) {
//so tell bots we're broken
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
exit;
}
}