不会盗QQ,还当什么程序员?

2023-11-09

99156fd52b3b24f91cf57ff797cb9f96.png

上面这个段子估计很多朋友都看过,程序员被黑过无数次,在其他人眼中,仿佛我们需要写得了木马,翻得了围墙,修得了电脑,找得到资源,但凡是跟计算机沾点边的,咱都得会才行。

cea48ca7fa205cac4e72fca2073a2850.png

段子归段子,言归正传,对于咱们程序员来说,多多少少了解一些信息安全的技术知识还是大有裨益的,不仅能了解一些计算机和网络的底层原理,也能反哺我们的开发工作,带着安全思维编程,减少漏洞的产生。

本文内容:

- 网络安全
  - SQL注入
  - XSS攻击
  - CSRF攻击
  - DDoS攻击
  - DNS劫持
  - TCP劫持
  - 端口扫描技术
- 系统安全
  - 栈溢出攻击
  - 整数溢出攻击
  - 空指针攻击
  - 释放后使用攻击
  - HOOK
  - 权限提升
  - 可信计算
- 密码学
  - 对称加密 & 非对称加密
  - 秘钥交换技术
  - 信息摘要算法
  - 数据编码技术
  - 多因子认证技术

信息安全大体可分为三个大的分支:

  • 网络安全

  • 系统安全

  • 密码学

下面轩辕君就这三个领域分别罗列一些常用的黑客技术,部分技术是存在领域交叉的,就将其划入主要那个类别里去了。

网络安全

SQL注入

Web安全三板斧之首,大名鼎鼎的SQL注入。

25074d488ea114386c2b5379af6b88b0.png

SQL注入攻击的核心在于让Web服务器执行攻击者期望的SQL语句,以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等操作,达到其邪恶的目的。

而如何让Web服务器执行攻击者的SQL语句呢?SQL注入的常规套路在于将SQL语句放置于Form表单或请求参数之中提交到后端服务器,后端服务器如果未做输入安全校验,直接将变量取出进行数据库查询,则极易中招。

8d3fa71b79638903668094efcfd0efb9.png

举例如下:

对于一个根据用户ID获取用户信息的接口,后端的SQL语句一般是这样:

select name,[...] from t_user where id=$id

其中,$id就是前端提交的用户id,而如果前端的请求是这样:

GET xx/userinfo?id=1%20or%201=1

其中请求参数id转义后就是1 or 1=1,如果后端不做安全过滤直接提交数据库查询,SQL语句就变成了:

select name,[...] from t_user where id=1 or 1=1

其结果是把用户表中的所有数据全部查出,达到了黑客泄露数据的目的。

以上只是一个极简单的示例,在真实的SQL注入攻击中参数构造和SQL语句远比这复杂得多,不过原理是一致的。outside_default.png

防御手段:对输入进行检测,阻断带有SQL语句特征对输入

重点关注前端工程师Web后端工程师

XSS攻击

Web安全三板斧之二,全称跨站脚本攻击(Cross Site Scripting),为了与重叠样式表CSS区分,换了另一个缩写XSS。

7da91c09ff360ed823349c382202aaa4.png

XSS攻击的核心是将可执行的前端脚本代码(一般为JavaScript)植入到网页中,听起来比较拗口,用大白话说就是攻击者想让你的浏览器执行他写的JS代码。那如何办到呢?一般XSS分为两种:

反射型

d9b50cd9d3b670a93b1d4336aaf193ca.png

1、攻击者将JS代码作为请求参数放置URL中,诱导用户点击       示例:

http://localhost:8080/test?name=<script>alert("you are under attack!")</script>

2、用户点击后,该JS作为请求参数传给Web服务器后端

3、后端服务器没有检查过滤,简单处理后放入网页正文中返回给浏览器

4、浏览器解析返回的网页,中招!

存储型

40c86a957623bac35984bdcac13a7641.png

上述方式攻击脚本直接经服务器转手后返回浏览器触发执行,存储型与之的区别在于能够将攻击脚本入库存储,在后面进行查询时,再将攻击脚本渲染进网页,返回给浏览器触发执行。常见的套路举例如下:

1、攻击者网页回帖,帖子中包含JS脚本

2、回帖提交服务器后,存储至数据库

3、其他网友查看帖子,后台查询该帖子的回帖内容,构建完整网页,返回浏览器

4、该网友浏览器渲染返回的网页,中招!

防御手段:前后端均需要做好内容检测,过滤掉可执行脚本的侵入

重点关注前端工程师Web后端工程师

CSRF攻击

Web安全三板斧之三,攻击示意图如下:

ae5e49ab6067274977800899ebfe081c.png

核心思想在于,在打开A网站的情况下,另开Tab页面打开恶意网站B,此时在B页面的“唆使”下,浏览器发起一个对网站A的HTTP请求。这个过程的危害在于2点:

1、这个HTTP请求不是用户主动意图,而是B“唆使的”,如果是一个危害较大的请求操作(发邮件?删数据?等等)那就麻烦了

2、因为之前A网站已经打开了,浏览器存有A下发的Cookie或其他用于身份认证的信息,这一次被“唆使”的请求,将会自动带上这些信息,A网站后端分不清楚这是否是用户真实的意愿

重点关注前端工程师Web后端工程师

DDoS攻击

DDoS全称Distributed Denial of Service:分布式拒绝服务攻击。是拒绝服务攻击的升级版。拒绝攻击服务顾名思义,让服务不可用。常用于攻击对外提供服务的服务器,像常见的:

  • Web服务

  • 邮件服务

  • DNS服务

  • 即时通讯服务

  • ......

c2c38cae1663f23a4b393c34f7422583.png

在早期互联网技术还没有那么发达的时候,发起DoS攻击是一件很容易的事情:一台性能强劲的计算机,写个程序多线程不断向服务器进行请求,服务器应接不暇,最终无法处理正常的请求,对别的正常用户来说,看上去网站貌似无法访问,拒绝服务就是这么个意思。

后来随着技术对发展,现在的服务器早已不是一台服务器那么简单,你访问一个www.baidu.com的域名,背后是数不清的CDN节点,数不清的Web服务器。

这种情况下,还想靠单台计算机去试图让一个网络服务满载,无异于鸡蛋碰石头,对方没趴下,自己先趴下了。

7db4346ed65d305577673ff6a014b311.png

技术从来都是一柄双刃剑,分布式技术既可以用来提供高可用的服务,也能够被攻击方用来进行大规模杀伤性攻击。攻击者不再局限于单台计算机的攻击能力,转而通过成规模的网络集群发起拒绝服务攻击。

3ae60e94c471bc7283e13e995a748455.png

拒绝服务攻击实际上是一类技术,根据具体实施手段的不同,又可以进一步细分:

  • SYN Flood

  • ICMP Flood

  • UDP Flood

  • ......

防御手段:即便是到现在,面对DDoS也没有100%打包票的防御方法,只能靠一些缓解技术一定层面上减轻攻击的威力。这些技术包括:流量清洗SYN Cookie等等。

重点关注运维工程师安全工程师

DNS劫持

当今互联网流量中,以HTTP/HTTPS为主的Web服务产生的流量占据了绝大部分。Web服务发展的如火如荼,这背后离不开一个默默无闻的大功臣就是域名解析系统:

3a47b153cdf199de78dd4ce8f3b69163.png

如果没有DNS,我们上网需要记忆每个网站的IP地址而不是他们的域名,这简直是灾难,好在DNS默默在背后做了这一切,我们只需要记住一个域名,剩下的交给DNS来完成吧。

也正是因为其重要性,别有用心的人自然是不会放过它,DNS劫持技术被发明了出来。

DNS提供服务用来将域名转换成IP地址,然而在早期协议的设计中并没有太多考虑其安全性,对于查询方来说:

  • 我去请求的真的是一个DNS服务器吗?是不是别人冒充的?

  • 查询的结果有没有被人篡改过?这个IP真是这个网站的吗?

944e3a210314745178661e73b4305ab9.png

DNS协议中没有机制去保证能回答这些问题,因此DNS劫持现象非常泛滥,从用户在地址栏输入一个域名的那一刻起,一路上的凶险防不胜防:

  • 本地计算机中的木马修改hosts文件

  • 本地计算机中的木马修改DNS数据包中的应答

  • 网络中的节点(如路由器)修改DNS数据包中的应答

  • 网络中的节点(如运营商)修改DNS数据包中的应答

  • ......

158fc65983df77a021d3b029c184a28b.png

后来,为了在客户端对收到对DNS应答进行校验,出现了DNSSEC技术,一定程度上可以解决上面的部分问题。但限于一些方面的原因,这项技术并没有大规模用起来,尤其在国内,鲜有部署应用。

d4f45b72729eaef307548d0d4b39ccb5.png

再后来,以阿里、腾讯等头部互联网厂商开始推出了httpDNS服务,来了一招釜底抽薪,虽然这项技术的名字中还有DNS三个字母,但实现上和原来但DNS已经是天差地别,通过这项技术让DNS变成了在http协议之上的一个应用服务。

重点关注安全工程师后端工程师运维工程师

TCP劫持

2adc910bf1f8f3e010e2ae331157b92f.png

TCP是TCP/IP协议族中非常重要的成员,位于传输层。协议本身并没有对TCP传输的数据包进行身份验证,所以我们只要知道一个TCP连接中的seq和ack后就可以很容易的伪造传输包,假装任意一方与另一方进行通信,我们将这一过程称为TCP会话劫持(TCP Session Hijacking)

7500a03eb0e0a083fef1eed4217d140c.png

TCP劫持技术是一种很老的技术,1995年被提出来后深受黑客青睐。不过近些年来,随着操作系统层面的安全机制增强和防火墙软件的检测能力提升,这种基础的攻击方式越来越容易被发现,慢慢的淡出了人们的视野。

重点关注安全工程师运维工程师

端口扫描技术

端口扫描是黑客经常使用的一种技术,它一般是作为网络攻击的前期阶段,用于探测目标开启了哪些服务,以便接下来发起针对该服务的攻击。

记得刚刚学习网络安全的时候,大家总会没事拿出工具来扫一扫,虽然扫了之后就没有了下文,也总是乐此不疲,在不懂的人面前秀一把自己的“黑客”能力。

bd7b2838c045f123313c054270fc9673.png

以TCP/IP协议族构建的互联网,网络服务总是离不开端口这个概念,不管是TCP也好,UDP也罢,应用层都需要一个端口号来进行网络通信。而我们常见的服务端口有:

  • 21: FTP文件传输服务

  • 25: SMTP邮件服务

  • 53: DNS域名解析系统服务

  • 80: HTTP超文本传输协议服务

  • 135: RPC远程过程调用服务

  • 443: HTTPS

  • 3389: MSRDP微软远程桌面连接服务

  • ......

端口扫描都原理,对于基于UDP的服务,发送对应服务都请求包,查看是否有应答;对于基于TCP的服务,尝试发起三次握手发送TCP SYN数据包,查看是否有应答。

如果远端服务器进行了响应,则表明对端服务器上运行了对应的服务,接下来则是进一步探知对端服务器使用的操作系统、运行的服务器程序类型、版本等等,随即针对对应的漏洞程序发起网络攻击。

445fb1ba568432981e2f7ddd8dbe9d66.png

由此可见,为安全着想,在互联网上应当尽可能少暴露信息,关闭不需要的服务端口。

防御手段:使用防火墙等安全产品,即时发现和阻断非法的扫描探测行为。

重点关注运维工程师安全工程师

[为防抄袭,手动插入文字水印,敬请谅解。本文来自微信公众号:编程技术宇宙]

系统安全

系统安全版块中的技术,一般是指攻击发生在终端之上,与操作系统息息相关。

栈溢出攻击

栈溢出攻击历史悠久,也是发生在系统侧最基础的攻击。

现代计算机基本上都是建立在冯-诺伊曼体系之上,而这一体系有一个最大的问题就是数据和指令都保存在存储器中。

b87dc444090b9d4b4da6761f7e7cd7ff.png

在计算机的内存中,既包含了程序运行的所有代码指令,又包含了程序运行的输入输出等各种数据,并没有一种强制的机制将指令和数据区分。因为对于计算机来说它们都是一样的二进制0和1,大部分时候都是靠程序按照既定的“规则”去解释理解内存中的这些0和1。而一旦这些“规则”理解错误,事情就变得糟糕起来。

具体到我们现代CPU和OS,不管是x86/x64处理器,还是ARM处理器,均采用了寄存器+堆栈式的设计,而这个堆栈中,既包含了程序运行各个函数栈帧中的变量数据等信息,还保存了函数调用产生的返回地址。

bba62f4f8074ffa3a6c7f0d3bf0fd9d5.png

所谓栈溢出攻击,则是通过一些手段输入到栈中的缓冲区中,冲破缓冲区原有的界限,将存储返回地址的位置覆盖为一个数值,使其指向攻击者提前布置的恶意代码位置,劫持了程序的执行流程。

防御手段:现代操作系统针对栈溢出攻击已经有非常成熟的应对方案,像Linux平台的Stack Canary,Windows平台的GS机制等等,程序员需要做的就是充分利用这些机制。

重点关注C/C++工程师

整数溢出攻击

和栈溢出攻击一样,整数溢出攻击也是属于溢出类攻击,不一样的是溢出的目标不是栈中的缓冲区,而是一个整数。

d4f0b8165eecb66837d052ac3144decf.png

我们知道,计算机数值以补码的方式表示和存储。在表示一个有符号数时,最高位是用来表示这是一个正数(0)还是一个负数(1),比如对于一个16位的short变量而言,+1和-1的表示方法如下:

+1: 0000 0000 0000 0001
-1: 1111 1111 1111 1111

一个16位的short变量表示的范围是-32768~32767,现在思考一个问题,假如一个short变量的值现在是32767:

32767: 0111 1111 1111 1111

如果现在对其执行+1操作,将变成:

1000 0000 0000 0000

而这正是-32768的补码形式!

试想一下,如果这个变量名字叫length作为strcpy参数,或是叫index作为数组的下标,整数的溢出将导致可怕的后果,轻则进程崩溃,服务宕机,重则远程代码执行,拿下控制权。

重点关注所有程序员

空指针攻击

空指针一般出现在指针没有初始化,或者使用new进行对象创建/内存分配时失败了,而粗心的程序员并没有检查指针是否为空而进行访问导致的攻击。

e3406784b7e89831f819e28e87498803.png

大多数情况下,这将导致内存地址访问异常,程序会崩溃退出,造成拒绝服务的现象

f2898a325271b1a62dbf908b3684e3ff.png

而在一些特殊的情况下,部分操作系统允许分配内存起始地址为0的内存页面,而攻击者如果提前在该页面准备好攻击代码,则可能出现执行恶意代码的风险。

释放后使用攻击

释放后使用Use After Free意为访问一个已经释放后的内存块。较多的出现在针对浏览器的JavaScript引擎的攻击中。

正常情况下,一个释放后的对象我们是没法再访问的,但如果程序员粗心大意,在delete对象后,没有即时对指针设置为NULL,在后续又继续使用该指针访问对象(比如通过对象的虚函数表指针调用虚函数),将出现内存访问异常。

069a3ed4f2c086ba179fdad045ceffb1.png

在上面的场景中,如果攻击者在delete对象后,马上又new一个同样内存大小的对象,在现代操作系统的堆内存管理算法中,会有很大概率将这个新的对象放置于刚刚被delete的对象的位置处。这个时候还通过原来对象的指针去访问,将出现鸠占鹊巢,出现可怕的后果。

养成好的编程习惯,对象delete后,指针及时置空。

重点关注C/C++工程师

HOOK

HOOK原意钩子的意思,在计算机编程中时常用到,用来改变原有程序执行流程。

534d7fb24207c66f8b14c23f59fafa40.png

在那个互联网充斥着流氓软件的年代,流行着一种键盘记录器的木马,用于记录用户键盘的输入,从而盗取密码,这其中QQ曾经是重灾区。

2c34b2baccf2f87617584ae0ae9dc96f.png

而实现这一功能的技术就是用到了HOOK技术,钩到了键盘敲击的事件消息。

除了消息HOOK,用得更多的是程序执行流程层面的HOOK。恶意代码被注入目标程序后,在函数入口处添加跳转指令,导致执行到此处的线程转而执行攻击者的代码,实现修改参数、过滤参数的目的。

77e97f63e7ee93e86a433bf7038a25ee.png

HOOK技术不仅为黑客使用,安全软件用的更多,安全软件需要守护整个系统的安全防线,通过HOOK技术在各处敏感API处设立检查,从而抵御非法调用攻击行为。

73c9f626b61f6e27af56e287067e1563.png

另外,软件补丁技术中也时常用到HOOK技术,软件厂商发现原来程序漏洞后,通过HOOK,修改既有程序的执行逻辑,从而达到修复漏洞的目的。

重点关注C/C++工程师

权限提升

现代操作系统都对运行于其中的进程、线程提供了权限管理,因为安全攻击无可避免,而权限的限制作为一道颇为有效的屏障将程序被攻击后的影响减少到最小。

换句话说,即便我们的程序因为漏洞原因被攻击执行了恶意代码,但因为操作系统的权限控制,恶意代码能干的事情也有限。

fc3f0494e6268de261f5cc533c615adf.png

就像一枚硬币总有两个面,有权限限制,自然而然就有权限提升。攻击者想要做更多事情,就得突破操作系统的限制,获取更高的权限。

在Windows上,经常叫获得管理员权限。

在Linux上,经常叫获得Root权限,手机Root也是这个意思。

在iOS上,经常叫“越狱”。

989cb7e9eaacbc427488138f91a3e45d.png

权限提升的方式五花八门,总体来说,程序执行的时候,所属进程/线程拥有一个安全令牌,用以标识其安全等级,在访问资源和执行动作的时候由操作系统内核审核。

权限提升的目标就是将这个安全令牌更改为高等级的令牌,使其在后续访问敏感资源和执行敏感动作时,凭借该令牌可以通过系统的安全审核。

3c5eb7ad665399fde009e277be9c7afc.png

而更改这个安全令牌的惯用伎俩便是利用操作系统内核漏洞(如前面所述的栈溢出、整数溢出、释放后使用等)执行攻击者的代码,实现安全令牌的篡改。

重点关注安全工程师

可信计算

安全攻击无处不在,不仅应用程序的环境不可靠,甚至连操作系统内核的环境也充满了风险。

如果一段程序(比如支付)必须在一个极度绝密的环境下执行,该怎么办?

b81086ff08b78f0db83c006ec4c2a44c.png

可信计算的概念被安全研究者提了出来,根据百科的解释:

可信计算/可信用计算(Trusted Computing,TC)是一项由可信计算组(可信计算集群,前称为TCPA)推动和开发的技术。可信计算是在计算和通信系统中广泛使用基于硬件安全模块支持下的可信计算平台,以提高系统整体的安全性 [1]  。签注密钥是一个2048位的RSA公共和私有密钥对,它在芯片出厂时随机生成并且不能改变。这个私有密钥永远在芯片里,而公共密钥用来认证及加密发送到该芯片的敏感数据。

可信计算中一个非常重要的概念是可信执行环境TEE(Trusted Execution Environment),简单来说就是在现有的计算机内部的世界里,再构建一个秘密基地,专门用于运行极度机密的程序。该秘密基地甚至连操作系统都轻易无法访问,更别说操作系统之上的应用程序了。

在移动端,ARM芯片占据了主流市场,ARM芯片提供了名为TrustZone技术的技术,在硬件层面新增一个可信计算环境,包含一个可信OS,和一些可信APP,和普通环境在硬件层面隔离,处理器内部进行通信完成两个世界的交互。

c08da1e230737834135e4542c2df84ca.png

重点关注终端系统工程师

密码学

由于数据传输的过程中会遇到信息泄漏、篡改、伪造的风险,加密技术应运而生。

对称加密 & 非对称加密

有加密就有解密,根据加密过程使用的密钥和解密过程使用的密钥是否相同,将加密算法分为了两个大类:对称加密非对称加密

最早出现的加密技术是对称加密

  • 对称加密:加密密钥和解密密钥一致,特点是加密速度快、加密效率高。常用的对称加密算法有:

    • DES

    • AES

    • RC4

这种加密方式中有一个非常关键的问题是,解密方需要拿到密钥才能进行解密,而密钥钥匙通过网络传输又会面临不安全的风险,这成了一个鸡生蛋,蛋生鸡的问题。

于是通信技术上一个划时代的技术被发明了出来,这就是非对称加密

05ecc32f4b24d531a40dddc921de1cf7.png
  • 非对称加密:加密密钥与解密密钥不一致,特点是算法较复杂,但安全性高。非对称加密的密钥一般分为公钥和私钥,公钥公开,私钥需保密。常用于数字认证,如HTTPS中握手阶段的服务器认证。常用的非对称加密算法有:

    • RSA

    • DH

    • ECC(椭圆曲线加密)

可以毫不夸张的说,没有了非对称加密,互联网绝不会发展到今天这样的高度。

秘钥交换技术

在互联网通信中,有加密就有解密,解密自然就需要密钥,那如何把这个密钥告诉对方呢?密钥交换算法就是要解决这个问题:如何安全的将密钥传输给对方?

d0ba9f90cc01aeeefbc57ae7f1be1f23.png

回头看看上面提到的非对称加密,它就可以解决这个问题:

  1. 服务器负责生成一对公私钥,公钥告诉客户端,私钥自己保存

  2. 客户端拿到公钥后,使用它来对后续通信将要使用的对称加密算法密钥进行加密传输

  3. 服务端收到后使用私钥解密,拿到这个密钥

  4. 以后双方可以通过对称加密进行传输通信

上面这个例子并不只是举例,在早期版本的HTTPS中,就是通过这种方式来进行密钥交换。而后来的版本中,另外一种叫DH及其变种的密钥交换算法用的越来越多。

2244c8cccbd7bbe4fb5dcf5f7d355f29.png

DH全称Diffie-Hellman,是两位数学家的名称构成,这种算法的核心是完全依靠数学运算实现密钥的交换。

信息摘要算法

信息摘要算法其实不算是一种加密算法,加密的前提是可以通过解密还原,而信息摘要算法的目的并不是对数据进行保护,也无法解密还原。

在一些语境下,信息摘要我们听得少,听的更多的名词是哈希

信息摘要算法的目的之一是校验数据的正确性,算法公开,数据通过该算法得出一个摘要值,收到数据后通过该算法计算出这个摘要,前后对比就知道是否有被篡改。

常用的信息摘要算法有:

  • MD5

  • SHA1

  • SHA256

数据编码技术

严格来说,数据编码技术也不算是加密算法,因为其目的同样不是为了加密,而只是为了将数据编码以便传输。

d5010d25ea7f1e35c4e5ba475d020faf.png

最常见的编码算法就是base64了,多用于编码二进制的数据,将不可见的字符编码后转换成64个常见字符组成的文本,便于打印、展示、传输、存储。如邮件eml格式中,将附件文件通过base64编码。

be31c76c6e5d3a55146ced78bd87939b.png

除了base64,还有常用于比特币钱包地址编码的base58。base家族还有base85、base92、base128等众多算法。它们的区别不仅仅在于参与编码的字符集不同,算法执行也是各有千秋。

多因子认证技术

说到认证,最常出现的莫过于登录、支付等场景。传统的认证技术就是密码技术,但随着网络攻击的日益猖獗以及互联网渗透到人们生活的方方面面,传统密码技术的安全性不足以满足互联网的发展。

a3cc3a44c173d6cba0380c350c727a93.png

多因子认证技术意为在传统密码认证之外,引入其他认证技术进行补充,使用2种及以上的方式共同完成认证。随着人工智能技术的发展,基于生物特征的认证技术突飞猛进:

  • 指纹认证

  • 虹膜认证

  • 人脸识别

  • ......

76ef584efdc09e6e89d0d91b6211c25c.png

这个世界从来不缺先行者,多因子认证看上去很复杂,好在已经有不少头部企业搭建了认证平台,对于绝大多数企业,需要做的只是下载SDK,调用API而已。

目前国内外主流的多因子认证平台有三大派系:

  • FIDO,国际标准,在国内,翼支付、百度钱包、京东钱包、微众银行等都已经应用55efcd298e6fd974cb21a33c64d4c7d0.png

  • IFAA,阿里系,凭借阿里在电商领域的优势,也吸引了众多追随者。10e6ec03587f3118e7c510bb04b29047.png

  • TUSI,腾讯系be353f8a0eefc5960ae4072f043a0d83.png

总结

本文罗列了一些常见的信息安全技术,主要分网络安全、系统安全和密码学三个领域展开。

信息安全技术不仅仅是安全工程师的事情,作为一位程序员,了解这些技术将帮助我们更好的Build The World

知识在于分享,转发这篇文章,让更多的人看到~

 
 

6056a5d0b1479a3c7ddbb8ae227f3f51.png

你好,我是厂长谭庆波,就读于哈工大,计算机系博士生,曾经的学渣,现在的学霸,拿过各路编程大奖 。

求学20载,从农村到C9博士,上学期间通过副业收入超 100 万,点击蓝字查看我的成长之路

同时,我也是知乎博主:谭庆波,日常分享高质量程序员认知,学习资料、技术干货等,欢迎围观。


 
 
最后说一件重要的事,我最近建了一个【晋级的程序员】社群,旨在帮助新手小白快速上手找到编程的乐趣,里面沉淀了大量编程相关经验教程以及学习资料,目前社群人数已经超过2000人,欢迎大家加入:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不会盗QQ,还当什么程序员? 的相关文章

  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • 对使用 importlib.util 导入的对象进行酸洗

    我在使用Python的pickle时遇到了一个问题 我需要通过将文件路径提供给 importlib util 来加载一些 Python 模块 如下所示 import importlib util spec importlib util sp
  • 如何在 Django 中使用基于类的视图创建注册视图?

    当我开始使用 Django 时 我几乎使用 FBV 基于函数的视图 来处理所有事情 包括注册新用户 但当我更深入地研究项目时 我意识到基于类的视图通常更适合大型项目 因为它们更干净且可维护 但这并不是说 FBV 不是 无论如何 我将整个项目
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Pandas 堆积条形图中元素的排序

    我正在尝试绘制有关某个地区 5 个地区的家庭在特定行业赚取的收入比例的信息 我使用 groupby 按地区对数据框中的信息进行排序 df df orig groupby District Portion of income value co
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • 从 python 检测 macOS 中的暗模式

    我正在编写一个 PyQt 应用程序 我必须添加一个补丁 以便在启用暗模式的 Macos 上可以读取字体 app QApplication Fix for the font colours on macos when running dark
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • 带有 RotatingFileHandler 的 Python 3 记录器超出 maxBytes 限制

    我使用以下代码来限制日志文件的大小 最小示例 import logging from logging handlers import RotatingFileHandler Set up logfile and message loggin
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • 使用 Python 将对象列表转为 JSON

    我在转换时遇到问题Object实例到 JSON ob Object list name scaping myObj base url u number page for ob in list name json string json du
  • 使用Multiprocessing和Pool时如何访问全局变量?

    我试图避免将变量冗余地传递到dataList e g 1 globalDict 2 globalDict 3 globalDict 并在全球范围内使用它们 global globalDict然而 在下面的代码中并不是这样做的解决方案 是否有

随机推荐

  • Selenium+Webdriver被检测识别出来的应对方案

    在写爬虫 面对很多js 加载的页面 很多人束手无策 更多的人喜欢用Senlenium Webdriver 古语有云 道高一尺魔高一丈 已淘宝为首 众多网站都针对 Selenium的js监测机制 比如 window navigator web
  • 转载:python 文件读写(追加、覆盖)

    with open file txt w as f f write content content 要放入文件的内容 要进行utf 8转码 可在pycharm中打开文件进行转码 x 创建一个新文件并打开它进行写入 b 二进制模式 t 文本模
  • 汇总下关于安全的13款必备工具

    汇总下关于安全的几款必备工具 1 burpsuite Burp Suite 是用于攻击web 应用程序的集成平台 http协议分析神器 里面包括了不少安全必备的功能 重放 爆破 扫描并且支持自定义脚本 实现自己想要的功能 Burp Suit
  • MacBook Big Sur 完美解决外接显示器 字体模糊、边缘不清 HIDPI 解决办法

    该文章转发MacBook Big Sur 完美解决外接显示器 字体模糊 边缘不清 HIDPI 解决办法 毕扬博客
  • error: invalid conversion from ‘void*‘ to ‘char*‘ [-fpermissive]

    include
  • 【计算机视觉】InvaSpread 讲解

    任何的书写错误 排版错误 概念错误等 希望大家包含指正 在阅读本篇之前建议先学习 机器学习 噪声对比估计 NCE 计算机视觉 MoCo 讲解 计算机视觉 InstDis 讲解 InvaSpread 在 InvaSpread 中 负样本的个数
  • 点云数据学习总结之一:点云数据存储格式

    最近研究点云数据 找了下相关的资料 看了许多的博文 下面总结了我认为比较写的比较好的博文链接 有需要的可以看下 刚刚才研究 所以可能不全 欢迎大家补充 共同学习 同时 未避免转载的博客链接失效 所以对博客内容进行了截图 如果原博主觉得受到侵
  • RestHighLevelClient封装使用,Java调用ES客户端 [支持ES6.x]

    前言 之前做项目的时候 需要用到Es的操作 本来想使用EsJpa的 即SpringDataElasticsearch 结果项目采用的是SpringBoot1 x版本 不得已 只要自己封装RestHighLevelClient来使用 不过网上
  • 蓝桥杯python技能升级

    只通过了百分之40 后面超时了 给没有头绪的伙计们一个思路吧 也请大佬给一个更好的解题思路 import math n m map int input split max 0 此为加的最大点 当加的次数小于0的时候 return0 if m
  • el-select下拉框只回显value不回显label的原因以及解决方法

    el select的采用的是map的key value结构 因此只显示value而不显示label的原因是 value的类型不正确 只需要在回显之前加上一行代码 将这个value转换成对应的类型即可 我这个里面需要的int类型 因此转成in
  • 集合相似度(PAT)

    题目链接 https www patest cn contests gplt L2 005 一开始用map超时了 总是有一组数据超时 当时觉得很纳闷 后来学到了 其实set也是可以开数组的 map也是 include
  • ubuntu 下安装chrome浏览器

    1 将google chrome stable current amd64软件复制移动到家目录下 2 打开终端 路径在家目录下 3 依次运行下面三条命令 sudo apt get install google chrome stable s
  • Swift的几种传值方式

    传值方式 在进行页面跳转过程中无法避免需要进行值的传递 那么值的传递可以分为正向传值和反向传值 例如在SourceViewController跳转至DestinationViewController的过程中需把前者的属性值传递给后者称为正向
  • 【系列 1】手写vue响应式原理

    手写vue响应式原理 首先我们看看原生 vue 做了什么 可见 vm 第一层与 data 内都能获取到 data 数据 并且其数值都进行了 ge
  • 王道训练营-C语言-1

    1 字符 include
  • 【热门框架】Maven中聚合,继承指的是什么?有什么作用?

    Maven中的聚合和继承是两个重要的功能 用于管理多个项目的共同部分 1 聚合 Maven中的聚合 Aggregation 指的是将多个子项目聚合成一个父项目的过程 聚合的语法如下 xml
  • 数据库初探(1)————关于InnoDB和MyISAM两种数据库存储引擎

    1 mysql中最常见的两种数据库引擎 InnoDB存储引擎 InnoDB存储引擎是Mysql的默认事务引擎 也是最重要 使用最广泛的存储引擎 它被设计用来处理大量的短期事务 短期事务大部分情况下都是可以正常提交的 很少回滚 MyISAM存
  • 【超详解】JavaWeb三大组件讲解

    文章目录 前言 一 Servlet 二 Filter 三 Listener 总结 前言 JavaWeb三大组件指的是 Servlet Filter Listener 三者提供不同的功能 然而很多人可能只用过其中一个或者两个 Servlet
  • 创建React项目

    在开发React项目前最关键的当然是项目的创建 现在的前端工程化使得前端项目的创建也变得越来越复杂 在这里介绍三种从零开始创建React项目的方式 分别是在浏览器中直接引入 使用官方脚手架create react app 使用Webpack
  • 不会盗QQ,还当什么程序员?

    上面这个段子估计很多朋友都看过 程序员被黑过无数次 在其他人眼中 仿佛我们需要写得了木马 翻得了围墙 修得了电脑 找得到资源 但凡是跟计算机沾点边的 咱都得会才行 段子归段子 言归正传 对于咱们程序员来说 多多少少了解一些信息安全的技术知识
Powered by Hwhale