Php 如何防止依赖XPath的爬虫获取页面内容
是一个php库,使evreybody能够攻击我(类似于cURL)。然后我有了一个想法来防止它,我想为我的元素使用动态类名。看看这个:Php 如何防止依赖XPath的爬虫获取页面内容,php,html,css,parsing,xpath,Php,Html,Css,Parsing,Xpath,是一个php库,使evreybody能够攻击我(类似于cURL)。然后我有了一个想法来防止它,我想为我的元素使用动态类名。看看这个: <div class="<?php $ClassName ?>">anything</div> // $className is taken from the database 在页面的CSS中定义类: 很抱歉,你的努力将白费。即使类名随机更改,您的DOM仍然会受到位置攻击,例如:div+div>span>a 但是,即使你旋
<div class="<?php $ClassName ?>">anything</div> // $className is taken from the database
在页面的CSS中定义类:
很抱歉,你的努力将白费。即使类名随机更改,您的DOM仍然会受到位置攻击,例如:div+div>span>a
但是,即使你旋转你的位置(例如通过添加虚假的div
和span
),任何值得的刮刀实际上都不会在意:它会在你的页面上找到文本,然后从最近的标记推断出意图。顺便说一句,谷歌就是这样工作的
你有一个现实的方法来解决这个问题。首先,将IDS监视器连接到web服务器。当IDS检测到扫描模式时,节流或关闭IP。或者,这是我最喜欢的,把扫描仪扔进装有伪造内容的蜜罐里。也就是说,如果你的实际文本读到“Freds widgets是世界上最好的”,那么你可以在另一个页面上读到“Bobs gonads没有海上幸福感”
我将后一种策略部署在我的几个客户的网站上,在中国的抄袭猫上获得了有趣的结果。在本地完成之前,使用数据库获取类名不是最优的。您应该定义一个包含所有类名的数组,然后通过array\u rand
拾取一个,如下所示:
// php code
<?php
$classes = array('class1','class2','class3','class4');
$class_name = $classes[array_rand($classes)];
?>
// html code
<div class="<? php echo $class_name; ?>">anything</div>
// css code
<style>
.<? php echo $class_name; ?> {
// your css codes
}
</style>
为了更高的安全性,您可以将内容(这里是“任何内容”)(除了外部动态标记)。例如:
<span1>anything</span1> // <span1> changed to <span2,3,4....>
任何内容//更改为
在这种情况下,包含数据的相邻标记也是动态的,这使得爬虫程序更加困难
最后,我必须说,你不能完全阻止爬虫,你只是让它变得困难。如果您真的想保护您的数据,您可以这样做:
- 增加了对用户的限制。(例如,只有注册用户才能看到重要信息)
- 监控使用您网站的IP(如果可疑,请阻止)
- 使用相关软件。(例如限制每天搜索IP)
您是否试图防止您的知识产权被盗?您可以通过要求用户在访问内容和/或向其收费之前登录来限制您的知识产权被盗。这将使你的内容更难在搜索引擎中被索引。另外请注意,这不被视为“攻击”,这是爬行/刮取。如果您试图阻止您的公开可用web内容被刮取,那么您可能需要重新考虑它是否应该是公开可用的web内容(我可以:-),任何稍有了解的人也可以这样做。你只能更努力,永远不可能。在我看来,这是一个毫无意义的方法。没有任何东西可以阻止任何人从那里抓起整个页面并开始工作。当然,这有点难,但很有挑战性。如果您的HTML是以可预测的方式构造的,那么这仍然是很容易做到的,不需要类或id。Public是公共的,你对此无能为力。谢谢你提供的BTW和ID,但我不明白你最喜欢的,我应该怎么做?你使用软件来检测有人扫描你的页面。当检测到错误页面时,为扫描仪提供错误页面。他们会认为他们在复制你,但实际上,他们复制的是虚假内容。我正在开发一个Solr应用程序,该应用程序让dotnet应用程序充当页面爬虫,它使用它所爬网的每个站点上元素的xpath获取内容。这个问题的方法应该会阻止它正常工作。很高兴看到这些技术被记录在案,谢谢!这将阻止许多幼稚的刮取,但不幸的是,它不会阻止智能刮取——那些通过查找文本然后从周围的标记推断意图而“由内而外”工作的刮取。对于这些问题,您必须在较低的网络级别部署操作修复程序。您可能仍然无法检测和阻止分发的刮擦,但最终评论员在原始问题中所说的是正确的:公共内容可以通过某种方式随时复制。实际上,结束标记必须颠倒”“
和
// php code
<?php
$classes = array('class1','class2','class3','class4');
$class_name = $classes[array_rand($classes)];
?>
// html code
<div class="<? php echo $class_name; ?>">anything</div>
// css code
<style>
.<? php echo $class_name; ?> {
// your css codes
}
</style>
// php code
<?php
// dynamic class
$classes = array('class1','class2','class3','class4');
$class_name = $classes[array_rand($classes)];
// dynamic tags
$tags_statr = array('','<div>','<div><div>','<div><p>','<span><div>');
$tags_end = array('','</div>','</div></div>','</div></p>','</span></div>');
$numb = array_rand($tags_statr);
?>
// html code
<?php echo $tags_statr[$numb]; ?>
<div class="<? php echo $class_name; ?>">anything</div>
<?php echo $tags_end[$numb]; ?>
// css code
<style>
.<? php echo $class_name; ?> {
// your css codes
}
</style>
<span1>anything</span1> // <span1> changed to <span2,3,4....>