程序员 每天上班路上要至少3个小时!怎样有效的利用这个时间提升自己?

,与百万开发者在一起

已获得原公众号的授权转载

在很多人眼里,程序员是一类高薪、“高危” 的职业。他们穿着格子衫、顶着一碗超帅的光头,能修电脑、能黑网站、简直无所不能。。。

但直到我自己当上程序员,才发现其实很多都是对程序员的误解。除了外行的误解外,还有很多来自于程序员同行的误解。今天这篇文章呢,我想结合自己的学习 / 工作经历和感悟,分享下我对这些误解的看法,当然也希望给程序员朋友们一些实质性的建议和启发。

外行的误解1. 程序员为啥工资那么高?人均年薪百万?

作为达不到平均的一方,我觉得这句话伤害不大,侮辱性极强。

程序员平均薪资可能的确稍微高了一点点,但是年薪百万真的是幸存者偏差了,真的极少数程序员(尤其是只凭技术的程序员)能做到这个地步。如果你拿我和小马哥去平均,那我还人均千万、人均上亿呢对吧?

之前很多同学看我视频都吐槽说:“你为什么还有头发,你个菜鸡!”

我觉得这句话伤害不大,侮辱性极强,如果发量代表水平的话我应该比在座的大多数同学都要浓密才对。

所以有没有种可能,是因为太菜,需求做不出来、Bug 改不完,所以才经常熬夜加班、精神压力极大,导致头发熬没了呢?

咳咳,别骂了别骂了,是我本人了。

3. 感觉程序员的手速都很快?

我觉得这个要分情况。拿我自己来说,我一般在 2 种情况下敲键盘比较快:

  1. 要么是在写贼简单的、不用动脑的重复代码(比如增删改查)

所以有没有种可能,程序员的手速是通过摸鱼、怼产品、重复劳动、或者是平时打游戏打得多而提升的呢?

不过毕竟要经常敲代码,所以程序员的手速通常都不慢。

我记得我之前不怎么加班的时候,就有同学在我视频下评论:你为什么不加班?

这个问题直接把我问懵了,好像我真的觉得自己应该加班,不加班是罪过。

我想说其实程序员也是有个人时间的。至于为什么程序员经常会加班呢?我觉得主要是以下几点:

  1. 首先是我们的程序代码是越写越多的,写的越多,系统越复杂,Bug 就越多。就拿我自己来说,刚做项目一周的时候,就那几行代码,Bug 多好查。但现在项目做了一年多了、用户也多了,很多陈年老 Bug 慢慢被发现了,而且经常牵一发而动全身。

  2. 第 2 点是程序员对排期的错误估算。我发现一个有趣的事情,需求是做不完的,你需求做的越快,新需求来的就越快;而且我们很多时候只考虑了做需求的时间,没有考虑改 Bug 的时间。但现实却有可能是改 Bug 的时间比开发的时间还要长。所以可能的话,还是别把需求排太满,预留一部分时间改 Bug。

  3. 当然还有很多其他因素,比如不会拒绝需求、不会跟产品 battle;缺乏经验、写的系统不利于维护、或者身边的人都很卷你不好意思走等等。总之加班是由很多方面决定的。

5. 重启可以解决 Bug?!

对不起,我觉得这个并不是误解。。这是真的!

以前我遇到过一些莫名其妙的 Bug 就死扣到底,但后来我就学聪明了,先重启一下编辑器、重启下软件,说不定就好了。因为 Bug 不一定是你造成的,可能真的是编辑器的 Bug。

大家就理解为电脑死机后,重启一下就又能开机了。原理应该是差不多的(将程序置于初始化状态)?

同行的误解1. 算法和数据结构不重要?

有很多程序员是这么认为的,觉得工作中也用不到自己写算法,用个现成的函数、类库,或者上网抄一段就能搞定对吧?

但事实上,有些时候并不是你用不到算法,而是你缺了一些知识,根本想不到可以用算法去更好地解决问题。比如同样是存储和查找 20 万个单词,没学过算法,用数组也能存、也能顺序查找,但是时空间都存在浪费;那如果你知道前缀树或者其他数据结构,就可以大幅节省存储空间、提升查找效率。

我觉得自己学的知识越多,反而会越觉得基础才是最重要的。因为上层的技术不断发展、不断迭代和淘汰,但是底层原理、编程思想、基本功一般是不会变的。

当然也有同学问是不是前端就不用学数据结构和算法了呢?只能这么说,这一块在前端面试的比重的确不大,时间紧大家可以优先以技术框架学习为主,但是有空了还是要好好补一下基础。

2. 写程序应当追求完美?

我觉得这句话对一半,应该是追求 特定条件下的最优解。

没有工作经验的同学会觉得程序就要完美、看见你程序有 bug 了、写的不好看了、前人留屎山代码了,多少都会嫌弃。

其实真实工作下,我们没办法把程序写到完美,往往是空间和时间的权衡,比如 HashMap ,用内存换查找效率;或者人力成本和资源的权衡,比如花钱买现成的服务、节省开发时间;再或者是需求和实现的权衡,比如天天都让你做紧急需求,你还有空去优化架构、有空去追求极致的性能么?对不对,代码屎山就是这么来的。

所以这里就要求我们在写代码之前先做调研设计,多思考几种方案、权衡利弊,然后从中选择相对的最优解。同时也希望对别人写的代码多一些包容,把你放在别人的场景下,你未必能做得更好。

3. 代码量等于水平?

在学校的时候,我的确是这么认为的,当时经常跟舍友吹牛逼说我今天又写了多少行代码。但现在仔细回想一下,绝大多数可能都是复制粘贴、增删改查。

进了公司后我才发现,真正写代码的时间很少,像前期的需求评审、跟产品 Battle 啊、方案设计、技术选型啊、沟通、资源协调更重要,也往往更花时间。在你想清楚要不要写代码、怎么写代码后,再去写代码,那时你会发现只不过是一种翻译工具而已。

而且就我观察下来,一般职级越高、工资越高、能力越强的人,写的代码反而越少。并不是他们写不出来,而是他们已经写的太多了、已经有了很多经验、更懂得去利用工具来脱离重复的工作,比如写个自动化脚本、重复代码生成工具之类的。

还有一方面原因是公司需要他们去做更重要的事情,从底层的执行慢慢转变为上层的决策,比如刚刚说的方案设计、或者系统架构。大佬定了个框架,写个 Demo,剩下的就交给我们小码农对吧。

所以代码量是无法真正权衡水平的,在做需求时多去思考更合理的解决方案、写代码时尽量避免重复劳动,才是我们要追求的,

4. 技术决定程序员的水平?

我觉得这个误解和上一个很像啊,如果你觉得程序员的工作就是写代码,写的多、写得快就是强者,那你就真的把自己当成码农了。

我觉得衡量优秀程序员的标准绝不止有技术,比如问题的解决能力,同一件事,你完成的比别人快比别人好;比如业务理解能力,给你一个需求,很快就能判断它是否合理、梳理清楚流程;比如沟通能力,你能够很好地维护用户、组员、同事、跨部门合作者的关系,从杂乱的消息中提取出有效信息;比如产品思维,你能给出更好的建议来推动产品发展;比如管理能力,善于组织成员、推动团队发展。再比如分享表达能力,能把自己学会的东西清晰地讲出来、让别人也能理解,我觉得很酷的事情,也是我一直做分享的原因。

这是一件程序员才懂的T恤

再见,彼得 2.0!世界上第一个真正的赛博格宣告死亡

程序员版本的八荣八耻~

【揭秘】那些当了程序员后才知道的事!

a、服务器的相关信息(真实ip,系统类型,版本,开放端口,WAF等)

b、网站指纹识别(包括,cms,cdn,证书等),dns记录

c、whois信息,姓名,备案,邮箱,电话反查(邮箱丢社工库,社工准备等)

e、子域名收集,旁站,C段等

f、google hacking针对化搜索,pdf文件,中间件版本,弱口令扫描等

g、扫描网站目录结构,爆后台,网站banner,测试文件,备份等敏感文件泄漏等

h、传输协议,通用漏洞,exp,github源码等

a、浏览网站,看看网站规模,功能,特点等

b、端口,弱口令,目录等扫描,对响应的端口进行漏洞探测,比如 rsync,心zang出血,mysql,ftp,ssh弱口令等。

c、XSS,SQL注入,上传,命令注入,CSRF,cookie安全检测,敏感信息,通信数据传输,暴力破解,任意文件上传,越权访问,未授权访问,目录遍历,文件 包含,重放攻击(短信轰炸),服务器漏洞检测,最后使用漏扫工具等

3、漏洞利用&权限提升

c、linux脏牛,内核漏洞提权e

4、清除测试数据&输出报告

总结,输出渗透测试报告,附修复方案

验证并发现是否有新漏洞,输出报告,归档

1、拿到一个待检测的站,你觉得应该先做什么?

a、获取域名的whois信息,获取注册者邮箱姓名电话等,丢社工库里看看有没有泄露密码,然后尝试用泄露的密码进行登录后台。用邮箱做关键词进行丢进搜索引擎。利用搜索到的关联信息找出其他邮箱进而得到常用社交账号。社工找出社交账号,里面或许会找出管理员设置密码的习惯 。利用已有信息生成专用字典。

b、查询服务器旁站以及子域名站点,因为主站一般比较难,所以先看看旁站有没有通用性的cms或者其他漏洞。

c、查看服务器操作系统版本,web中间件,看看是否存在已知的漏洞,比如IIS,APACHE,NGINX的解析漏洞

d、查看IP,进行IP地址端口扫描,对响应的端口进行漏洞探测,比如 rsync,心zang出血,mysql,ftp,ssh弱口令等。

e、扫描网站目录结构,看看是否可以遍历目录,或者敏感文件泄漏,比如php探针
f、google hack 进一步探测网站的信息,后台,敏感文件

开始检测漏洞,如XSS,XSRF,sql注入,代码执行,命令执行,越权访问,目录读取,任意文件读取,下载,文件包含,远程命令执行,弱口令,上传,编辑器漏洞,暴力破解等

利用以上的方式拿到webshell,或者其他权限

2、判断出网站的CMS对渗透有什么意义?

查找网上已曝光的程序漏洞。

如果开源,还能下载相对应的源码进行代码审计。

/down/\技术。IIS 中默认不支持,ASP只是脚本语言而已。入侵的时候asp的木马一般是guest权限…APSX的木马一般是users权限。

52、如何绕过waf?

54、渗透测试中常见的端口

b、数据库类(扫描弱口令)

c、特殊服务类(未授权/命令执行类/漏洞)

WebLogic默认弱口令,反序列 hadoop默认端口未授权访问

d、常用端口类(扫描弱口令/端口爆破)

cpanel主机管理系统登陆 (国外用较多) 2222 DA虚拟主机管理系统登陆 (国外用较多) 3128 squid代理默认端口,如果没设置口令很可能就直接漫游内网了 kangle主机管理系统登陆 WebLogic默认弱口令,反序列 都是一些常见的web端口,有些运维喜欢把管理后台开在这些非80的端口上 hadoop默认端口未授权访问

文件上传有哪些防护方式

计算机网络从物理层到应用层xxxx

有没有web服务开发经验

mysql两种提权方式(udf,?)

有没有抓过包,会不会写wireshark过滤规则

2、对输入的特殊字符进行Escape转义处理
3、使用白名单来规范化输入验证方法
4、对客户端输入进行控制,不允许输入SQL注入相关的特殊字符
5、服务器端在提交数据库进行SQL查询之前,对特殊字符进行过滤、转义、替换、删除。

五、为什么参数化查询可以防止SQL注入

使用参数化查询数据库服务器不会把参数的内容当作sql指令的一部分来执行,是在数据库完成sql指令的编译后才套用参数运行

简单的说: 参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑

七、盲注是什么?怎么盲注?

盲注是在SQL注入攻击过程中,服务器关闭了错误回显,我们单纯通过服务器返回内容的变化来判断是否存在SQL注入和利用的方式。盲注的手段有两种,一个是通过页面的返回内容是否正确(boolean-based),来验证是否存在注入。一个是通过sql语句处理时间的不同来判断是否存在注入(time-based),在这里,可以用benchmark,sleep等造成延时效果的函数,也可以通过构造大笛卡儿积的联合查询表来达到延时的目的。

八、宽字节注入产生原理以及根本原因

在数据库使用了宽字符集而WEB中没考虑这个问题的情况下,在WEB层,由于0XBF27是两个字符,在PHP中比如addslash和magic_quotes_gpc开启时,由于会对0x27单引号进行转义,因此0xbf27会变成0xbf5c27,而数据进入数据库中时,由于0XBF5C是一个另外的字符,因此\转义符号会被前面的bf带着"吃掉",单引号由此逃逸出来可以用来闭合语句。

统一数据库、Web应用、操作系统所使用的字符集,避免解析产生差异,最好都设置为UTF-8。或对数据进行正确的转义,如mysql_real_escape_string+mysql_set_charset的使用。

如果此 SQL 被修改成以下形式,就实现了注入

之后 SQL 语句变为

九、SQL如何写shell/单引被过滤怎么办

2、SSRF漏洞的成因 防御 绕过

成因:模拟服务器对其他服务器资源进行请求,没有做合法性验证。利用:构造恶意内网IP做探测,或者使用其余所支持的协议对其余服务进行攻击。防御:禁止跳转,限制协议,内外网限制,URL限制。绕过:使用不同协议,针对IP,IP格式的绕过,针对URL,恶意URL增添其他字符,@之类的。301跳转+dns rebindding。

由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件

2、常见的上传绕过方式

文件上传目录设置为不可执行
使用白名单判断文件上传类型
用随机数改写文件名和路径

4、审查上传点的元素有什么意义?

有些站点的上传文件类型的限制是在前端实现的,这时只要增加上传类型就能突破限制了。

引入一段用户能控制的脚本或代码,并让服务器端执行 include()等函数通过动态变量的方式引入需要包含的文件;
用户能够控制该动态变量。

2、导致文件包含的函数

能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞

1、金融行业常见逻辑漏洞

单针对金融业务的 主要是数据的篡改(涉及金融数据,或部分业务的判断数据),由竞争条件或者设计不当引起的薅羊毛,交易/订单信息泄露,水平越权对别人的账户查看或恶意操作,交易或业务步骤绕过。

中间人攻击是一个(缺乏)相互认证的攻击;由于客户端与服务器之间在SSL握手的过程中缺乏相互认证而造成的漏洞

防御中间人攻击的方案通常基于一下几种技术

1.公钥基础建设PKI

使用PKI相互认证机制,客户端验证服务器,服务器验证客户端;上述两个例子中都是只验证服务器,这样就造成了SSL握手环节的漏洞,而如果使用相互认证的的话,基本可以更强力的相互认证

使用复杂加密哈希函数进行计算以造成数十秒的延迟;如果双方通常情况下都要花费20秒来计算,并且整个通讯花费了60秒计算才到达对方,这就能表明存在第三方中间人。

3.使用其他形式的密钥交换形式

每台主机都有一个ARP缓存表,缓存表中记录了IP地址与MAC地址的对应关系,而局域网数据传输依靠的是MAC地址。在ARP缓存表机制存在一个缺陷,就是当请求主机收到ARP应答包后,不会去验证自己是否向对方主机发送过ARP请求包,就直接把这个返回包中的IP地址与MAC地址的对应关系保存进ARP缓存表中,如果原有相同IP对应关系,原有的则会被替换。这样攻击者就有了偷听主机传输的数据的可能

1.在主机绑定网关MAC与IP地址为静态(默认为动态),命令:arp -s 网关IP 网关MAC

2.在网关绑定主机MAC与IP地址

利用合理的请求造成资源过载,导致服务不可用

伪造大量的源IP地址,分别向服务器端发送大量的SYN包,此时服务器端会返回SYN/ACK包,因为源地址是伪造的,所以伪造的IP并不会应答,服务器端没有收到伪造IP的回应,会重试3~5次并且等待一个SYNTime(一般为30秒至2分钟),如果超时则丢弃这个连接。攻击者大量发送这种伪造源地址的SYN请求,服务器端将会消耗非常多的资源(CPU和内存)来处理这种半连接,同时还要不断地对这些IP进行SYN+ACK重试。最后的结果是服务器无暇理睬正常的连接请求,导致拒绝服务。

对一些消耗资源较大的应用页面不断发起正常的请求,以达到消耗服务端资源的目的。

SYN Cookie/SYN Proxy、safereset等算法。SYN Cookie的主要思想是为每一个IP地址分配一个“Cookie”,并统计每个IP地址的访问频率。如果在短时间内收到大量的来自同一个IP地址的数据包,则认为受到攻击,之后来自这个IP地址的包将被丢弃。

MySQL两种提权方式

该目录默认是不存在的,这就需要我们使用webshell找到MYSQL的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到该目录即可。

其中的第18行的命令,上传前请自己更改。

执行成功后,即可添加一个普通用户,然后你可以更改命令,再上传导出执行把用户提升到管理员权限,然后3389连接之就ok了。

Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下可以利用 Redis 的相关方法,可以成功在 Redis 服务器上写入公钥,进而可以使用对应私钥直接登录目标服务器

a、通过 Redis 的 INFO 命令, 可以查看服务器相关的参数和敏感信息, 为攻击者的后续渗透做铺垫
b、上传SSH公钥获得SSH登录权限
d、slave主从模式利用

攻击者通过未授权访问进入脚本命令执行界面执行攻击指令

开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,而且可以远程访问数据库,登录的用户可以通过默认端口无需密码对数据库进行增、删、改、查等任意高危操作。

MongoDB自身带有一个HTTP服务和并支持REST接口。在2.6以后这些接口默认是关闭的。mongoDB默认会使用默认端口监听web服务,一般不需要通过web方式进行远程管理,建议禁用。修改配置文件或在启动的时候选择–nohttpinterface 参数nohttpinterface=false

Memcached是一套常用的key-value缓存系统,由于它本身没有权限控制模块,所以对公网开放的Memcache服务很容易被攻击者扫描发现,攻击者通过命令交互可直接读取Memcached中的敏感信息。

a、登录机器执行netstat -an |more命令查看端口监听情况。回显0.0.0.0:11211表示在所有网卡进行监听,存在memcached未授权访问漏洞。

通过调用加密API将payload加密放入一个会被执行的段字节中。但是具体回答工程中我只回答道了SSRF老洞,m3u8头,偏移量,加密。

STRUTS,SPRING 常见的java框架漏洞 其实面试官问这个问题的时候我不太清楚他要问什么,我提到struts的045 048,java常见反序列化。045 错误处理引入了ognl表达式 048 封装action的过程中有一步调用getstackvalue递归获取ognl表达式 反序列化 操作对象,通过手段引入。apache common的反射机制、readobject的重写,其实具体的我也记不清楚。。。然后这部分就结束了

同源策略限制不同源对当前document的属性内容进行读取或设置。不同源的区分:协议、域名、子域名、IP、端口,以上有不同时即不同源。

Jsonp安全攻防技术,怎么写Jsonp的攻击页面
涉及到Jsonp的安全攻防内容

JSON劫持,跨域劫持敏感信息,页面类似于

php中命令执行涉及到的函数

DL函数,组件漏洞,环境变量。

== 在进行比较的时候,会先将字符串类型转化成相同,再比较

如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换成数值并且比较按照数值来进行

0e开头的字符串等于0

各种数据库文件存放的位置
入侵 Linux 服务器后需要清除哪些日志?
查看当前端口连接的命令有哪些?

ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

反弹 shell 的常用命令?一般常反弹哪一种 shell?为什么?
通过Linux系统的/proc目录 ,能够获取到哪些信息,这些信息可以在安全上有哪些应用?

系统信息,硬件信息,内核版本,加载的模块,进程
linux系统中,检测哪些配置文件的配置项,能够提升SSH的安全性。

如何一条命令查看文件内容最后一百行
如何加固一个域环境下的Windows桌面工作环境?请给出你的思路。
AES/DES的具体工作步骤

RSA加密是对明文的E次方后除以N后求余数的过程

n是两个大质数p,q的积

如何生成一个安全的随机数?

引用之前一个学长的答案,可以通过一些物理系统生成随机数,如电压的波动、磁盘磁头读/写时的寻道时间、空中电磁波的噪声等。

建立TCP连接、客户端发送SSL请求、服务端处理SSL请求、客户端发送公共密钥加密过的随机数据、服务端用私有密钥解密加密后的随机数据并协商暗号、服务端跟客户端利用暗号生成加密算法跟密钥key、之后正常通信。这部分本来是忘了的,但是之前看SSL Pinning的时候好像记了张图在脑子里,挣扎半天还是没敢确定,遂放弃。。。
对称加密与非对称加密的不同,分别用在哪些方面

TCP三次握手的过程以及对应的状态转换

(1)客户端向服务器端发送一个SYN包,包含客户端使用的端口号和初始序列号x;
(2)服务器端收到客户端发送来的SYN包后,向客户端发送一个SYN和ACK都置位的TCP报文,包含确认号xx1和服务器端的初始序列号y;
(3)客户端收到服务器端返回的SYNSACK报文后,向服务器端返回一个确认号为yy1、序号为xx1的ACK报文,一个标准的TCP连接完成。

tcp面向连接,udp面向报文 tcp对系统资源的要求多 udp结构简单 tcp保证数据完整性和顺序,udp不保证

a、客户端发送请求到服务器端
b、服务器端返回证书和公开密钥,公开密钥作为证书的一部分而存在
c、客户端验证证书和公开密钥的有效性,如果有效,则生成共享密钥并使用公开密钥加密发送到服务器端
d、服务器端使用私有密钥解密数据,并使用收到的共享密钥加密数据,发送到客户端
e、客户端使用共享密钥解密数据

直接输入协议名即可,如http协议http

简述路由器交换机、防火墙等网络设备常用的几个基础配置加固项,以及配置方法。

我要回帖

更多关于 如何利用上班时间提升自己 的文章

 

随机推荐