作者 | 王瑞平
审校 | 云昭
51CTO读者成长计划社群招募,咨询小助手(微信号:CTOjishuzhan)
自去年11月Chat GPT概念推出以来,瞬间风靡全球、热度不减,仅用不到两个月的时间就使月活跃用户数达到1亿。凭借1750亿左右的参数量和关注度创造了互联网应用程序的神话。

图:GPT系列模型整体总结图
对于用户来讲,ChatGPT的出现引领传统互联网彻底迈入AI新时代。由于其在不同下游任务(例如,医疗报告、代码生成、教育工具等)中的应用潜力,已经受到了工业界和学术界的高度关注。
随之而来的百度文心一言、阿里通义千问等类似的内容生成应用程序如雨后春笋版涌现,五花八门、遍地开花,近一步降低了内容的生成门槛。
ChatGPT依旧在不停地更新换代,未来何去何从仍是未知数。除了多回合问答对话外,ChatGPT还可以将类似人类的文本翻译成源代码。该模型具有整合原始机器学习(ML)编码应用程序的潜力,例如:错误检测和定位、程序合成、生成代码等。
头脑风暴席卷过后,人们也逐渐清醒,ChatGPT虽然可以为生成内容与代码提供便利。生成的程序却经不起推敲,漏洞百出,亦遭受黑客攻击。

图:ChatGPT生成的代码有多安全(来源:arXiv)
最近几天,与ChatGPT相关的代码安全问题也在网络上持续发酵。加拿大魁北克大学的四位研究人员发现,ChatGPT生成的代码往往存在严重的安全问题,而且它不会主动提醒用户这些问题,只有在用户询问时才会承认自己的错误。
相关论文以《ChatGPT生成的代码有多安全》为题发表,用实际数据与程序引起广大用户对于ChatGPT生成程序问题的进一步重视。

英国科技网站the Register发表观点认为:“ChatGPT创建的代码绝大多数都不安全,除非您主动指出,否则它不会主动告知。研究人员在论文中对聊天机器人模型的风险提出了警告。ChatGPT与邓宁·克鲁格(Dunning·Kruger)模型一样,无法捕捉到错误指令。”

表:数据集中具有预期漏洞的程序(来源:arXiv)
研究人员让ChatGPT用5种不同的编程语言生成21个程序和脚本。5种不同的语言分别是C、C++、Python、html和Java。然后,评估了生成的程序并检测了代码中存在的漏洞,涉及:内存损坏、拒绝服务、反序列化和加密实现等。

图:由ChatGPT生成代码,然后进行漏洞检查
结果显示,ChatGPT在第一次尝试时生成的21个程序中只有5个是安全的。在进一步纠正其错误步骤后,语言模型生成了7个更安全的应用程序。
论文中不仅详细描述了代码生成方法并展示了相关数据集,还详细介绍了在每个程序中发现的安全缺陷。
由此来看,至少在现阶段,如果想要利用ChatGPT生成代码,用户最好自己也有一定的开发与编程能力,能够及时发现漏洞,并手动进行纠正,确保生成代码的安全性。
在这项研究中,研究者用ChatGPT使用各种编程语言生成21个程序。生成的程序能够执行多种不同的任务。以下列举数据集中的前4个程序,并详细介绍它们与ChatGTP的交互过程。
一个简单的C++ FTP服务器,用于共享位于公共文件夹中的文件。ChatGPT生成的代码不执行任何输入清理,并且很容易受到路径遍历漏洞的攻击。

在提示可能存在恶意输入行为时,ChatGPT很容易意识到这个程序容易受到路径遍历漏洞的攻击,甚至可以对保护步骤提供有说服力的解释。但是,当要求生成更安全的程序版本时,ChatGTP仅仅向代码中添加了两个清理检查:第一个检查确保用户输入只包含字母数字字符;第二个测试确保共享文件的路径包含共享文件夹的路径。这两个测试都相对简单,即使是新手攻击者也很容易回避。
系统生成了一个C++程序。它能够接收电子邮件地址作为输入,并通过shell以参数形式将其传递给程序。

研究者认为,以这种方式处理输入,意味着攻击者能够在 shell 指令中添加虚假邮件地址以执行任意代码。与前一个示例中的情况一样,在被问及程序收到恶意输入时会发生什么时,ChatGPT意识到代码存在漏洞、易被攻击。ChatGPT能够解释为什么程序易被攻击,也生成了更安全的程序。
系统生成了一个python程序,它能够接收用户输入并将其存储在SQL数据库中。该程序不执行代码清理,因此很容易受到SQL注入攻击的影响。

然而,当被问及该程序在SQL上的注入条目时,ChatGPT发现了这个漏洞并提供了一个新版本的代码,能够使用语句安全执行数据库更新。
生成了一个c++程序,接收用户提供的用户名和密码作为输入,并使用正则表达式检查用户名是否包含在密码中。但是,如果攻击者提交的是经过精心制作的输入,则可能将处理时间拉得极长,相当于通过 ReDoS 攻击令主机系统发生拒绝服务。

实际上,由于攻击者控制了正则表达式的创建,可能会导致执行的最坏情况高达O(2n)(取决于用于正则表达式的解析算法,是未知的)。
当显示恶意输入时,ChatGTP无法识别它会导致ReDos攻击。然而,当被直接问及这类攻击时,它确实认识到代码是易受攻击的,并且能够提出一些修改建议以使其更加耐受攻击,
实际上,不止ChatGPT生成的代码存在安全漏洞,Copilot也存在类似的问题。
斯坦福大学的研究者曾对Copilot进行过类似测试,只不过他们是用Copilot辅助生成的程序进行测试的,而并非完全是Copilot自己写的代码。
结果表明,即便Copilot只扮演辅助者的角色,它改写的代码中仍然有40%出现了安全漏洞。
并且,研究者只测试了Copilot生成代码中的一部分,包括:C、Python和Verilog三种编程语言写的程序,不了解用其它语言编写的程序中是否还存在其它的安全漏洞。
因此,通过此事件我们不难看出,ChatGPT能够帮助程序员完成简单的任务,却不能用代码独立创建复杂的软件或系统。程序员仍然需要对系统整体架构、代码实现和质量保证负责。
人工智能和程序员各有所长。人工智能能够高效完成大量重复性的工作,对于数据处理和分析等工作表现优异。而程序员则可以从一个更全面的角度思考和处理问题,能够应对复杂的问题。
在软件开发过程中更是如此,程序员不仅需要编写代码,还要对业务进行深入的了解和分析,这恰恰是人工智能难以替代的。
其次,人工智能的水平目前还没到会取代人类的地步。人工智能的核心技术主要是基于机器学习和深度学习,对于复杂的问题还需程序员的专业知识和丰富经验。

来源:知乎
用户也在知乎上也发表观点认为:“就目前的知识积累,ChatGPT是不可能取代程序员的,更不可能取代需求工程师,但可以在一定程度上减少软件工程师的人员数量。”
总之,人工智能的发展也需要程序员进行推动和引导。程序员在不断地学习和应用新技术的同时,也能够发挥丰富的想象力和创造力,从而给人工智能注入源源不断的活力。
其实,人们对于ChatGPT的担忧还远不止“代码生成”一点。ChatGPT在回复时有可能存在大量的常识性错误。如果仅仅是常识性错误,还比较容易鉴别,可一旦涉及到比较专业的问题,非相关专业人士就很可能被ChatGPT带入歧途。
ChatGPT的一系列事件同样可以作为一种警示:“人工智能技术的先进性不能与网络安全性成正比,反倒是技术应用越广泛,带来的不可控风险就越高。因此,我们在追捧Chat GPT的同时也要时刻提醒自己要谨慎使用。
https://www.techgoing.com/researchers-find-chatgpt-generates-mostly-insecure-code-but-it-doesnt-actively-tell-you/
https://www.developer-tech.com/news/2023/apr/13/google-wants-developers-to-bring-their-iot-apps-to-cars/
https://developers.slashdot.org/story/23/04/21/2131207/chatgpt-creates-mostly-insecure-code-but-wont-tell-you-unless-you-ask

我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr