Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止依赖XPath的爬虫获取页面内容_Php_Html_Css_Parsing_Xpath - Fatal编程技术网

Php 如何防止依赖XPath的爬虫获取页面内容

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 但是,即使你旋

是一个php库,使evreybody能够攻击我(类似于cURL)。然后我有了一个想法来防止它,我想为我的元素使用动态类名。看看这个:

<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....>