什么是编程语言?"我总会问自己这个问题,SQL是吗?Excel是吗?HTML是吗?……这些问题总在困扰着我,所以我把这些疑问整理成问卷的形式,向各位网友征集了大家的想法。
上图就是我们这次调研结果,这次调查我们一共设置了三个选项:是、否和弃权,调查对象主要有HackNews和Reddit的读者组成。
正如我们所预期的那样,绝大多数人都认同C、Java和JavaScript是编程语言,而其他选项的调查结果就有趣了很多:
Verilog:大多数人同意Verilog(硬件描述语言)是一种编程语言,他们认为即使软件的输出是硬件,但生成硬件的过程仍然是程序化的。
SQL:大多数人认为SQL是一个编程语言,但是很多人因为其缺乏完整性而提出了异议,SQL虽然没有类和循环,但其仍然有算术表达式、函数和变量。
C preprocessor:被调查者对于C preprocessor的兴趣明显要高于正则表达式,C preprocessor本质上是一个字符串替换引擎,它比正则表达式的功能更少,只用于生成C代码。但是,很多人认为是否被用来生成代码是判断是否为编程语言的关键因素。
LaTeX:咋一看,这是最接近编程语言的,LaTeX具有变量,函数和许多其他类PL功能(LaTeX是Turing-complete!),但是由于它的输出是一个文档,所以我并不看好大家会把它当做是一种编程语言。
但是令人惊讶的是,它就排在C preprocessor之后。
CSS:进入Web语言时代之后,少数的受访者也把CSS当做是一种编程语言。
TensorFlow:TensorFlow是一种具有变量、循环、编译器等的数据流语言。然而,因为它是一种特定于领域的语言,而且没有独立的语法(它通常通过Python API编程),大多数被调查者并不认为它是一种编程语言。
HTML:可能和CSS的情况一样。
JSON: JSON是一种数据规范语言,但是大多数人并不把它当做是编程语言。
Microsoft Word: GUIs不可能是编程语言!
Eclipse:看结果,很显然并不是!
对于上述列举的大家是否认为其属于编程语言呢?欢迎在下方留言评论!
京东SRC(Security Response Center)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致。
mysql5.0以上版本中存在一个重要的系统数据库information_schema,通过此数据库可访问mysql中存在的数据库名、表名、字段名等元数据。information_schema中有三个表成为了sql注入构造的关键。
SQL注入常用SQL函数
// sqli vuln code
Statement statement = con.createStatement();
String sql = "select * from users where username = '" + username + "'";
logger.info(sql);
ResultSet rs = statement.executeQuery(sql);
// fix code 如果要使用原始jdbc,请采用预编译执行
String sql = "select * from users where username = ?";
PreparedStatement st = con.prepareStatement(sql);使用未预编译原始jdbc作为demo,注意此demo中sql语句参数采用单引号闭合。
对于字符类型注入,通常先尝试单引号,判断单引号是否被拼接到SQL语句中。推荐使用浏览器扩展harkbar作为手工测试工具。https://chrome.google.com/webstore/detail/hackbar/ginpbkfigcoaokgflihfhhmglmbchinc
正常页面应该显示如下:
admin后加单引号导致无信息回显,原因是后端sql执行报错,说明引号被拼接至SQL语句中
select * from users where username = 'admin' #正常sql
select * from users where username = 'admin'' #admin'被带入sql执行导致报错无法显示信息mysql中使用order by 进行排序,不仅可以是字段名也可以是字段序号。所以可以用来判断表中字段数,order by 超过字段个数的数字就会报错。
判断字段数
当order by 超过4时会报错,所以此表共四个字段。
后端所执行的sql语句
select * from users where username = 'admin' order by 1-- '此处我们将原本username的值admin替换为admin’ order by 1 —+,其中admin后的单引号用于闭合原本sql语句中的前引号,—+用于注释sql语句中的后引号。—后的+号主要作用是提供一个空格,sql语句单行注释后需有空格,+会被解码为空格。
主要用于定位后端sql字段在前端显示的位置,采用联合查询的方式确定。注意联合查询前后字段需一致,这也就是我们为什么做第二步的原因。
通过下图可知,后端查询并回显的字段位置为2,3位。
联合查询后的字段可以随意,本次采用的是数字1到4直观方便。
group_concat()函数用于将查询结果拼接为字符串。
sqlmap兼容python2和python3,可以自动化检测各类注入和几乎所有数据库类型。
-u 可能存在注入的url链接
-r读取http数据包
--data 指定post数据
--cookie 指定cookie
--headers 指定http头 如采用token认证的情况下
--threads 指定线程数
--dbms 指定后端的数据库
--os 指定后端的操作系统类型
--current-user 当前用户
--users 所有用户
--is-dba 是否是dba
--sql-shell 交互式的sqlshell
-p指定可能存在注入点的参数
--dbs 穷举系统存在的数据库
-D指定数据库
--tables 穷举存在的表
-T指定表
--column 穷举字段
-C指定字段
--dump dump数据直接检测
其中—cookie用于指定cookie,—batch 自动化执行,—dbms指定数据库类型
检测结果
读取系统中存在数据库
—dbs读取当前用户下的数据库
读取指定库下的表
-D java_sec_code —tables
dump users表数据
-D java_sec_code -T users —dump
//采用#不会导致sql注入,mybatis会使用预编译执行
@Select("select * from users where username = #{username}")
User findByUserName(@Param("username") String username);
//采用$作为入参可导致sql注入
@Select("select * from users where username = '${username}'")
List<User> findByUserNameVuln01(@Param("username") String username);//错误写法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like '%${_parameter}%'
</select>
//正确写法
<select id="findByUserNameVuln02" parameterType="String" resultMap="User">
select * from users where username like concat(‘%’,#{_parameter}, ‘%’)
</select>order by 后若使用#{}会导致报错,因为#{}默认添加引号会导致找不到字段从而报错。
//错误写法
<select id="findByUserNameVuln03" parameterType="String" resultMap="User">
select * from users
<if test="order != null">
order by ${order} asc
</if>
</select>
//正确写法 id指字段id 此表字段共四个 所以id为1-4
<select id="OrderByUsername" resultMap="User">
select * from users order by id asc limit 1
</select>slqmap手册:https://octobug.gitbooks.io/sqlmap-wiki-zhcn/content/Users-manual/Introduction.html
sql注入详解:http://sqlwiki.radare.cn/#/
实世界中,作为程序员,选择哪一门编程语言并不会如生死攸关那般重要。毕竟大多数常见的编程语言的基本概念都大同小异,且对于编程新手来说,大多数编程语言看起来都差不多,它们可以让你获得近乎相同的结果。但从开发人员的角度来看,编程语言不仅是一种工具,而且选择正确的编程语言将会影响一个人的职业生涯、钱途以及未来生活的幸福指数。在此,本文将基于 2018 年的开发者生态系统报告,剖析当前主流编程语言的趋势,探索在新的一年中,最具潜力、最值得学习的编程语言。
作者 | Rafi Zikavashvili
译者 | 安翔
责编 | 屠敏
出品 | CSDN(ID:CSDNNews)
选择编码语言需要进行各方面权衡。对于初学者来说,需要在学习代价和收益之间找到平衡点。此外,还需要清楚编程语言的长期前景。对于 21 世纪初的 Web 开发人员来说,PHP 和 Ruby on Rails 很显然是提升自己职业发展的最佳语言。而如今的市场条件已经发生了巨大的变化,PHP 和 Ruby 不再是我们首推的选项。
本文提供了一份我们在 2019 年最应该学习的编程语言指南。我们会一一介绍这几种语言,并且探讨其用途和长期前景。我们还会列举几个用于专业特定领域的编程语言。为了显示每种语言的市场份额及占有率,我们参考了 Stack Overflow 2018 年开发者调查报告中的编程语言排名。
学习一门新语言的关键原因之一是能够利用它增加开发者的就业机会。编程面试是雇主了解开发者对该编程语言了解程度的重要途径。为了更好地帮助开发者通过编程面试,本文会提供一系列在面试中可能涉及的问题。
我们参考了 Stack Overflow 调查,并根据推荐力度对这几种编程语言进行了排名。此外,我们将这份榜单的编程语言限制为命令式语言,而不包括声明性语言,比如 HTML、CSS 和 SQL,以及 shell 脚本语言,比如 Bash。
第 1 名:JavaScript
在 2015 年,有 54.4% 的开发人员将 JavaScript 列为最受欢迎的技术。而 2018 年的Stack Overflow 开发者调查报告显示,JavaScript 位居榜首,有高达 71.5% 的专业开发人员将 JavaScript 评为最受欢迎的编程语言,增长幅度非常大。
这种大幅增长的重要原因在于 JavaScript 几乎无处不在。针对客户端领域,你可以使用诸如 Angular、React 和 Vue 等 JavaScript 前端框架来构建基于浏览器的 Web 应用程序。而 Node.js 能够让开发者使用与前端一样的编程语言来开发后端程序。使用 Node,开发者可以编写 Web 服务端程序,用来管理物联网(IoT)项目,或者进行机器学习实验。在众多编程语言中优先选择 JavaScript 的另一个重要原因在于,它得到了整个软件行业的广泛支持,Google、Facebook、微软以及亚马逊等科技巨头都在大力使用 JavaScript。开发者可以找到有关 JavaScript 的各种各样的学习资源,比如收费或者免费的课程、网站、书籍、视频以及博客,这些资源涵盖了该语言的方方面面。
在大部分时间里,JavaScript 一度被认为是编程语言领域的丑小鸭。尽管它至今未能变成美丽的天鹅,但在 JavaScript 社区齐心协力的努力下,它已经从基于浏览器的脚本语言变成了现代的多功能语言。随着时间的推移,JavaScript 的缺点越来越少。
值得注意的是,关于 JavaScript,许多雇主将在编程面试中通过候选人对JavaScript 特殊功能的了解程序来评估候选人能力。常见的编程面试问题会涉及到变量范围、闭包、回调以及条件运算符。任何从事 JavaScript 相关工作的开发者都应该熟知类似的面试问题。此外,我们还建议开发者去了解自己心仪的公司,研究其使用的技术栈,并熟悉相关的框架(例如 React、Angular 或者 Vue),从而能够在面试中展示自己的能力。
第 2 名:Python
Stack Overflow 调查显示,Python 受到了 37.9% 的专业开发者的亲睐。在过去五年中,Python 的发展速度比其它任何语言都快。如今 Python 的影响力非常巨大,就连很少涉及开发者相关主题报道的著名杂志经济学人也在最近的一篇文章中提到了 Python 语言(https://www.economist.com/graphic-detail/2018/07/26/python-is-becoming-the-worlds-most-popular-coding-language)。
Python 受到热捧的一部分原因在于它摆脱了很多其他语言的恼人惯例,比如它舍去了用来表示语句结束的分号。正是因为其简洁,Python 才得以取代 Java 作为计算机科学教学的主要语言,不仅大学,而且高中和小学的编程课程都优先选择 Python 来教学。在学术界,Python 已经成为机器学习和数据科学领域最流行的通用语言。事实上,Python 目前已经在这些领域占据了主导地位,在数据科学领域提出了 Python 与 R 语言结合使用的方案。
Python 与其他编码语言相比既有相似也有不同。Python 开发人员在面试时,首先会被考察对编程语言基本知识的理解,例如数据类型、模块化、函数和类。此外,候选人还可能会被问及如何编写 Python 脚本、如何使用 Python 进行面向对象编程或者如何使用 Python 进行函数式编程等问题。更进一步,开发者还需要了解 Python 特定的数据类型和功能,例如元组、列表推导、字典和装饰器。
第 3 名:Java
Java 在这份榜单中排名第三。根据 Stack Overflow 2018 年的调查,有45.5%的专业开发人员青睐 Java。
Java 能够持久地对开发者产生吸引力的一个重要原因是 Java 虚拟机(JVM)。JVM 使得用 Java 编写的程序能够在不同的硬件平台和设备上运行。Java 还能够帮助开发者处理数据类型和内存管理相关的让人头疼的任务。Java 简化了应用程序的开发,并且同一 Java 程序可以部署在不同的操作系统上,这使得 Java 成为大公司的首选语言。如此一来,只要你学好 Java,就很容易在大公司谋得一份不错的开发职位。Java 的另外一个重要用途是编写原生 Android 应用程序。随着 Android 操作系统在智能手机领域的遥遥领先,这促发了更多的开发人员学习 Java,从而投身 Android 应用开发大潮之中。
近年来,为了广泛利用 Java 的生态系统,有很多编程语言被创造,或者移植到 JVM。这些语言在特定领域中熠熠生辉,比如 Scala、Closure 和 Kotlin。Kotlin 有许多有趣的用途,比如编写 Android 应用程序和使用 Corda 框架开发区块链。
Java 开发人员在面试时,理解语言的范围非常重要。面试内容可能会涉及任何与Java 相关的主题。作为一名企业级软件 Java 开发者,你需要具备对 Java 基础结构的深刻理解,比如 JDK、JRE 和 JVM。Android 开发人员将被问及与 Android 相关的问题,包括 SDK 版本管理、intent、设备模拟以及应用程序部署过程。假如你面试的公司使用的是基于 JVM 的其他编程语言,那么你需要证明自己对该语言足够了解。
第4名:C#
在参加 Stack Overflow 2018 年调查的开发者中,有 35.5% 的专业人士是微软 C# 的粉丝。尽管很多开发者对微软的所作所为有些反感,但是在这份榜单中,仅有 JavaScript、Python 和 Java 的排名高于 C#。当然,Bash 脚本语言 40.4% 的支持率也比 C# 高,但是脚本语言不在本文的讨论范围内。
目前 Java 的支持率的确比 C# 高,但是从长远来看,种种迹象表明这种现状会发生改变。Java 提供新功能的步伐已开始放缓,而微软一直在积极为 C# 增加新的特性和功能。微软为了摆脱自身对 Windows 操作系统的依赖,一直法力与其他新的领域,包括购买 Xamarin 及其跨平台开发环境,发布多平台 .NET Core ,以及对 Azure 持续投资。C# 在未然的企业战略中扮演着重要角色,微软也在努力确保 C# 可以同时使用微软技术和开放的行业标准。
与 Java一样,C# 语言同样拥有强大的生态系统。这意味你在面试 C#职位时,需要对雇主的未来市场有一定程度的了解。与 Java 一样,大多数 C# 面试都包含了与C#基础架构相关的问题,包括 .Net 框架和公共语言运行时(CLR)。值得注意的是,CLR 还可以托管其他语言,例如 F# 和 VB.net。如果你面试的公司使用 C# 以外的 CLR 语言,那么你需要了解这门语言。
第5名:C / C ++
虽然 C 和 C ++ 是两门不同编程模型的独立语言,但它们之间的联系非常紧密,本文将把它们一起讨论。
对于通用和专用任务,例如应用程序开发、用户界面、移动应用程序和机器学习,C 语言都完全不擅长。但是,在嵌入式系统和操作系统领域,C 仍然占据绝对的主导地位。Linux 就是最好的例子。Linux 是有史以来最流行的操作系统,它既可运行在大型设备上,也可运行在小型的移动设备上。Linux 最核心的部分是 Linux 内核,而 Linux 内核就是用 C 语言编写的。C 语言的另一个常见用途是编写其他编程语言,比如榜单的第二名 Python 语言就是用 C 语言编写的。
C ++ 是更现代的并且面向对象的 C 语言版本。C ++ 通常用在对性能要求很高的领域。例如,许多涉及金融业务公司的后端系统中就会选择使用 C ++。C++ 以高性能著称,因此它是图形密集型应用程序的首选语言,比如游戏开发、图形引擎、虚拟现实和增强现实。
在参加 C 或者 C ++ 的面试时,面试官可能会提出一些适用于这两种语言的问题。这包括编码有关的数据类型、运算符、循环、条件语句、指针和内存管理等问题。开发者可能还会被要求定义和解释链表,以及编写实现和管理链表的简短程序。由于 C ++是面向对象的语言,因此与面向对象有关的对象、类、方法、属性等问题都有可能被问到。
其他语言
本文榜单中前五的语言都是通用型的。除此之外,在某些特定领域,同样有很多相对小众的编程语言,我将列举如下。
这其中,苹果的 Swift 应当是关注度最高的语言。Swift 是苹果公司推出的新型通用语言,旨在取代 Objective-C。Swift 可用于编写 iOS 和 Mac 桌面应用程序,苹果公司将其开源,希望它能够成为服务器语言。遗憾的是,希望暂时落空。
在 Web 开发领域,PHP 仍然十分盛行。尽管 PHP 语言存在很多局限性,并且市面上有很多针对它的替代品,但是 PHP 如今仍然被许多大型网站使用,例如 Facebook 和维基百科。Facebook 甚至创建了自己的 PHP 改良版,名为Hack。PHP 也是许多大型开源平台使用的语言,例如 WordPress 和 MediaWiki。这些平台得到了广泛的应用,PHP 用于为它们创建插件。Facebook 仍然热衷于使用 PHP,甚至还创建了自己的现代化版本的 PHP: Hack 语言。Ruby 就是一个PHP 的完美替代品,它更加现代并且设计得更好。Ruby on Rails Web 开发框架得到了广泛的部署,并拥有有庞大而活跃的社区。
在一些更加专业的领域,比如系统编程领域,谷歌的 Go 和 Mozilla 的 Rust 看起来都很不错。两种语言都旨在构建高并发的系统。在函数式编程领域,Elixir 是 Erlang 的替代品,Clojure 是一种在 JVM 上运行的新型的 Lisp,而 F#是一种在 .NET 上运行并具有许多主流功能的函数式语言。最后,如果你对快速增长的智能合约和基于以太坊的加密货币领域感兴趣,你可以了解一下 Solidity。
结论:选择正确的语言
在榜单的五种语言中,你应当如何选择适合自己的语言呢?根据当前趋势,具有最广泛应用的最通用语言是 JavaScript。你可以在大多数设备上运行它,并使用它来构建客户端、服务器和无服务器应用程序。在过去的十年中,JavaScript 已经被不断改造,它现在与 C# 和 Lisp 等现代语言有很多共同之处。是的,它仍然有一些不足之处,但这些缺点已经得到了很大改善。
我们的第二选择是 Python,从开发者职业生涯长期来看,Python 是非常好的选择。正如我们提到的那样,Python 已经广泛应用到科研和教育领域。它也是机器学习、人工智能和数据科学相关领域的主导语言。在构建用户界面时,JavaScript 比 Python 具有明显的优势。但随着时间的推移,这种优势可能会不再显著。对于初学者来说,Web Assembly 标准使得其他高级语言来编写基于浏览器的应用程序变成可能。此外,如果语音交互得到大众认可,那么图形用户界面将变得不再那么重要。亚马逊采用 Python 来开发 Echo 语音助手,因此 Python 已经在该领域占据了先机。
在企业级应用领域,你需要在 Java 和 C#之间进行选择。这两种语言在语法、功能和基础结构方面都非常相似,你可以根据个人偏好、工作可用性或者掷硬币的方法来做出选择。正如我们指出的那样,Java 比 C#历史更为久远、更受欢迎,并且提供的职位更多。而另一方面,微软的积极支持及其使 C#成为真正的跨平台解决方案的动力又为 C#的未来奠定了更好的前景。Java 仍然是 Android 的编程语言,但微软的 Xamarin 允许开发者使用 C#编写 Android、iOS 和 Mac 应用程序。需要知道的是,C#在创业社区声誉不好,在硅谷非常不受欢迎。在这些圈子中,C#开发人员通常被视为二等公民。
此外,开发者还需要注意的是,在申请 Java / C#企业级开发职位时,面试官将会考察你构建后端应用程序的能力,而不会局限某种语言。在解决实际问题时,你需要为解决方案编写具体的代码,这样你就可以在解决实际问题的同时展示自己对语言功能的了解程度。
最后,C 和 C ++都算作通用语言,但在实践中,它们主要用于特定领域。C 语言主要用于系统和嵌入式编程,C ++ 则擅长高性能以及资源密集型应用程序,比如实时图形应用程序。它们两者在各自的领域中很少有替代者,你应该在需要构建这些类型的应用程序时选择学习这些语言。
最重要的是,在参加编程面试时,请确保自己了解这门语言的方方面面。通过面试并非易事,你需要对编程语言的优势以及局限性足够了解,以便让自己的求职之路变得轻松。
原文:https://hackernoon.com/best-coding-languages-to-learn-in-2019-b49b49250a25本文为 CSDN 翻译,如需转载,请注明来源出处。
*请认真填写需求信息,我们会在24小时内与您取得联系。