
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了“K哥爬虫普法”专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识,知晓如何合法合规利用爬虫技术,警钟长鸣,做一个守法、护法、有原则的技术人员。
2018年1月至7月期间,呙某兴通过SQL注入漏洞以及编写爬虫脚本的方式,侵入计算机信息系统,获取计算机系统内存储的大量数据,其中涉及到个人信息的数量约为1500万余条,该将其获取的个人信息通过QQ销售给“Versace”、“同花顺”、“FF”、“糖果”等人,从中获利约54万余元。
公诉机关认为,呙某兴违反国家规定,侵入计算机信息系统,获取该计算机系统中存储的数据,情节特别严重,其行为触犯了《中华人民共和国刑法》第二百八十五条第二款,应当以非法获取计算机信息系统数据罪追究其刑事责任。
呙某兴对被指控的罪名无异议,但辩称起诉书指控的数量有异议,其只用了20多万条信息;对指控的入侵方式有异议,SQL技术不是入侵技术,爬虫技术只能获取网站页面的信息不能入侵系统或获取数据。
被告人呙某兴的辩护人的主要辩护意见:
1.被告人获取计算机信息系统数据使用的SQL注入漏洞是常见的黑客技术,被告人所获取的信息多为网站上公开的信息,只是将SQL方式作为一种收集手段、采用爬虫脚本具备合法性;
2.对起诉书指控涉及个人信息数量1500万余条有异议。获取的计算机信息系统数据有部分无效数据、涉案信息数据存在重复性、非法获利与涉案信息数量不对应;
3.对指控被告人获利54万元有异议,被告人通过爬虫脚本获得信息销售所得利益应属合法收益,应予以扣除;
4.被告人主动交代犯罪事实,认罪悔罪态度好,犯罪情节较轻,愿意缴纳罚金,建议对其适用缓刑。
法院认为,被告人呙某兴违反国家规定,侵入计算机信息系统,获取该计算机系统中存储的数据,情节特别严重,其行为已构成非法获取计算机信息系统数据罪,公诉机关指控成立。
关于被告人及其辩护人所提对起诉书指控涉及个人信息数量1500万余条有异议,部分计算机信息系统系数据系无效数据且存在重复计算问题的辩解和辩护意见,本院认为,公诉机关对被告人获取的信息进行重新梳理,合理推断出1500万余条个人信息,能够识别特定自然人身份或者反映特定自然人活动情况,故对该项辩解及辩护意见,本院不予采纳。
关于被告人及其辩护人所提获取计算机信息系统数据使用的SQL注入漏洞只是一种收集手段、采用爬虫脚本具备合法性,获取的信息多为网站上公开的信息的辩解和辩护意见,本院认为,被告人使用SQL注入漏洞以及编写爬虫脚本的方式侵入计算机信息系统,获取计算机系统内存储的大量数据,其中涉及到个人信息的数量达到约1500万余条,并非网站页面信息,故对该项辩解及辩护意见,本院不予采纳。
关于辩护人所提对指控被告人获利54万元有异议,应扣除被告人通过爬虫脚本获得的合法信息收入的辩护意见,本院认为,被告人通过编写爬虫脚本的方式非法入侵计算机信息系统,获取计算机系统内储存的信息并出售所得系违法收入,应计入违法所得,故对该项辩护意见,本院不予采纳。
关于辩护人所提被告人主动交代自己的犯罪事实,认罪悔罪态度好的辩护意见,本院认为,被告人辩称其使用SQL注入漏洞以及编写爬虫脚本的方式均未入侵到计算机系统,获取的只是网站页面信息,不属于如实供述自己的罪行,故对该项辩护意见,本院不予采纳。
被告人呙某兴犯非法获取计算机信息系统数据罪,判处有期徒刑五年,并处罚金人民币二万元。对被告人呙某兴违法所得人民币54万元依法予以追缴或责令退赔。
判决文书全文:
法院以呙某兴未经网站授权,利用特定网站的漏洞,使用 SQL 注入漏洞以及编写爬虫脚本的方式侵入计算机信息系统,获取计算机系统内存储的大量数据,其中涉及到个人信息的数量达到约1500万余条,且并非网站页面信息为由认定了该行为的非法性,我们先来了解下 SQL 注入和网络爬虫的基本原理:
所以侵入计算机信息系统并不是爬虫所能做到的事,数据库层面的渗透亦或是攻击应当是通过 SQL 注入实施的,而法院将编写爬虫脚本列为呙某兴侵入计算机信息系统的方式之一,是因为非法获取计算机信息系统数据罪与侵犯公民个人信息罪是法条竞合的关系,指一个犯罪行为同时触犯数个具有包容关系的具体犯罪条文,依法只适用其中一个法条定罪量刑的情况。不论是如呙某兴辩护中所述其利用爬虫技术采集的是某些网站上公开的个人信息,亦或是利于 SQL 注入技术渗透进数据库,再利用爬虫批量采集个人信息,这都是触犯了法律的 “红线” 的,理论上看,爬虫作为一项网络信息搜索技术,具有技术中立性,并未被我国现行法律所明令禁止,但是在司法实务中,“技术中立原则” 的适用是有边界的,如果使用技术的人用以危害社会,利用技术手段实施犯罪行为,则不因 “技术中立原则” 而免除刑事责任,如果涉及的是公民个人信息,基于特别法条优先于普通法条的原则,呙某兴的行为,适用于侵犯公民个人信息罪,对于公民个人信息数据一定要慎之又慎!
需要注意的是,一些网站会采取反爬措施,包括封 IP、封账号、JS 参数加密、代码混淆、浏览器指纹、TLS 指纹、验证等,以增加爬虫程序资源的成本,更有企业积极开发反爬虫技术以限制网络爬虫的访问权限,绕过网站反爬虫措施获取数据属于违背权利人意愿读取、收集数据,将有较大可能被认定为对计算机信息系统的 “侵入”,进而以非法获取计算机系统数据罪定罪处罚。对于 “侵入” 的理解:在以往判例中,司法机关主要基于以下两种路径判定对计算机信息系统的 “侵入”:一是无用户身份的侵入,即通过盗取、破解密码等方式进入系统;二是超权限访问的侵入,即具有合法用户身份,但超越自身授权范围访问信息资源。
信息公开不等同于数据公开,对于爬虫工程师来说,并不需要去厘清概念背后的区别与联系,只是在业务开展中需要树立风险防范意识,贸然爬取公开可见的信息仍会存有一定刑事风险,仔细甄别所要爬取的数据类型,谨慎处理包含公民个人信息、商业秘密等内容的信息,希望大家凡事三思而后行,老话长谈,谨记一点,公司是老板的,自由是自己的,法律是不容触犯的!

大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
我遇到了这个奇怪的错误.../Users/gideon/Documents/ca_ruby/rubytactoe/lib/player.rb:13:in`gets':Isadirectory-spec(Errno::EISDIR)player_spec.rb:require_relative'../spec_helper'#theuniverseisvastandinfinite...itcontainsagame....butnoplayersdescribe"tictactoegame"docontext"theplayerclass"doit"musthaveahumanplay
我有两个文本文件,master.txt和926.txt。如果926.txt中有一行不在master.txt中,我想写入一个新文件notinbook.txt。我写了我能想到的最好的东西,但考虑到我是一个糟糕的/新手程序员,它失败了。这是我的东西g=File.new("notinbook.txt","w")File.open("926.txt","r")do|f|while(line=f.gets)x=line.chompifFile.open("master.txt","w")do|h|endwhile(line=h.gets)ifline.chomp!=xputslineendende
我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme
我最近一直在查看一些gem的源代码。我经常看到的一个习惯用法是使用嵌套模块,其中包含连接到版本字符串中的版本常量,即围绕此类事物的变体:moduleChunkyBaconmoduleVersionMAJOR=0MINOR=6TINY=2endVERSION=[Version::MAJOR,Version::MINOR,Version::TINY].compact*'.'end以这种方式存储库版本信息有什么好处(如果有的话)?为什么不这样做:moduleChunkyBaconVERSION='0.6.2'.freezeend 最佳答案
如何使用如下两个数组构建一个数组:名称=[a,b,c]how_many_of_each[3,5,2]得到my_array=[a,a,a,b,b,b,b,b,c,c] 最佳答案 使用zip、flat_map和数组乘法:irb(main):001:0>value=[:a,:b,:c]=>[:a,:b,:c]irb(main):002:0>times=[3,5,2]=>[3,5,2]irb(main):003:0>value.zip(times).flat_map{|v,t|[v]*t}=>[:a,:a,:a,:b,:b,:b,:b,:b
如何在Ruby中获取linux系统(这必须适用于Fedora、Ubuntu等)的软件/硬件信息? 最佳答案 Chef背后的优秀人才,拥有一颗名为Ohai的优秀gemhttps://github.com/opscode/ohai以散列形式返回系统信息,例如操作系统、内核、规范、fqdn、磁盘、空间、内存、用户、接口(interface)、sshkey等。它非常完整,非常好。它还会安装命令行二进制文件(也称为ohai)。 关于ruby-如何在Ruby中获取linux系统信息,我们在Stack
我正在尝试构建一个seeds.rb文件以将初始管理员用户添加到数据库中。我有一个用户表和模型,以及一个角色表和模型。我有一个连接表,roles_users来加入用户角色和权限。这是架构:create_table"roles",:force=>truedo|t|t.string"name"t.datetime"created_at"t.datetime"updated_at"endcreate_table"roles_users",:id=>false,:force=>truedo|t|t.integer"role_id"t.integer"user_id"endcreate_table