CSRF(Cross-site request forgery),中文名称:跨站请求伪造。可以这么简单理解CSRF攻击:攻击者盗用了你的身份(获取登录正规网站的 cookie 信息), 并以你的名义发送恶意请求(比如转账、提交订单等)。CSRF 主要会导致个人的隐私泄露并威胁财产安全。我们用下面一幅图来描述一下 CSRF 攻击的形成与危害:从上面的示例过程可以看出,要完成一次 CSRF 攻击,受害者必须依次完成两个步骤:登录受信任网站A,并在本地生成Cookie;在不登出A的情况下,访问危险网站B;上面这几种情况看似很难一起发生,但在现实场景中却是很容易发生的。这主要是基于以下几个原因导致的:我们往往登录了一个网站后,打开多个 tab 页面去访问多个其他网站,类似于下图:关闭浏览器了后,本地的 Cookie 并不会立即过期,上次会话也并不意味着结束,除非我们点击登出(logout)或者主动清除浏览器缓存;所谓的危险网站,可能是经常被人访问的正规网站。该网站由于存在某种漏洞被人恶意攻击,并在网站中放入恶意链接诱导用户点击;基于以上三点,CSRF 攻击很可能每天在我们身边上演。但是网站必须要确保不存在相应的 CSRF 漏洞,否则极容易黑客攻击。关于 CSRF 攻击的主要防御手段便是在网页上添加一个随机的校验 token 值。由于 CSRF 的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在 cookie 中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再执行 CSRF 攻击。这种数据通常是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个伪乱数。当客户端通过表单提交请求时,这个伪乱数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪乱数,而通过 CSRF 传来的欺骗性攻击中,攻击者无从事先得知这个伪乱数的值,服务器端就会因为校验 token 的值为空或者错误,并拒绝这个可疑请求。
XSS 攻击又称 CSS,全称Cross Site Script (跨站脚本攻击),其原理是攻击者向有 XSS 漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击可以分成两种类型:非持久型 XSS 攻击:顾名思义,非持久型 XSS 攻击是一次性的,仅对当次的页面访问产生影响。非持久型 XSS 攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的;持久型 XSS 攻击:持久型 XSS,会把攻击者的恶意代码数据存储在服务器端,攻击行为将伴随着恶意代码的存在而一直存在。XSS 的攻击防范主要是对提交的各种字符串数据进行校验,避免出现可执行的前端代码。主要的防范措施有:对输入内容的特定字符进行编码,例如表示 html 标记的 < > 等符号;对重要的 cookie 设置 httpOnly,防止客户端通过 document.cookie 读取 cookie,此 HTTP 头在服务端设置;将不可信的值输出 URL 参数之前,进行 URLEncode 操作,而对于从 URL 参数中获取值一定要进行格式校验;不要使用 eval 来解析并运行不确定的数据或代码,对于 JSON 解析可使用 JSON.parse() 方法;后端接口也要对关键的字符进行过滤,防止将恶意的脚本代码保存到数据库中。
全称 Distributed Denial of Service,中文意思为“分布式拒绝服务”,就是利用大量合法的分布式服务器对目标发送请求,从而导致正常合法用户无法获得服务。DDoS 攻击方式简单粗暴,可以达到直接摧毁目标的目的。另外,相对其他攻击手段 DDoS 的技术要求和发动攻击的成本很低,只需要购买部分服务器权限或通过技术手段控制一批肉鸡即可。另一方面,DDoS 具有攻击易防守难的特征,服务提供商为了保证正常客户的需求需要耗费大量的资源才能和攻击发起方进行对抗。这些特点使得 DDoS 成为黑客们手中的一把很好使的利剑,而且所向披靡。DDos 的攻击形式多种多样,有针对资源消耗类攻击、服务消耗性攻击、反射性攻击、混合型攻击等等,最终达到对端服务不可用的目的。互联网发展至今,DDoS 攻击就一直存在,而且随着技术的发展,DDoS 的攻击方式也变化多端。目前而言,对于 DDoS 攻击仍旧是一个令人头疼的问题,许多创业公司或者规模较小的公司,不愿过多投入到防御体系的建设上,这就导致大部分公司面对高流量的 DDoS 攻击时都是直接投降,毫无还手之力。目前,安全产业对 DDoS 的防护系统本质上是一个基于资源较量和规则过滤的智能化系统,主要的防御手段和策略包括:资源隔离用户规则大数据智能分析资源对抗随着目前人工智能和深度学习技术的火热发展,在 Web 安全领域已经开展了许多关于这方面的实践研究,也相信不久的将来,DDoS 攻击能彻底被深度学习技术打败,不再成为大部分业内公司的噩梦。
DDOS(Distributed Denial of Service)也是一种经典的攻击模式,它不是利用服务器存在什么漏洞,而是直接粗狂的用大流量来访问你的网站,使你的网站承受不了这么多流量而崩溃。这种模式有时候还挺难处理的,因为流量的来源可能是一种变化的,都没有固定 IP 防不胜防。而这些攻击你的电脑可能是来自各地的私人电脑,只是被黑客利用了的傀儡机。
在上一个小节中讲解了 CSRF 攻击与防御的原理,本小节首先讲解了基于校验 Token 检测 CSRF 攻击的基本思想和步骤,然后通过一个银行转账的实例演示了 CSRF 的攻击与防御。
XSS 跨站脚本攻击(Cross-site scripting)使用到的技术主要为 HTML 和 Javascript 脚本。攻击者将对客户端有危害的代码放到服务器上作为一个网页内容,用户不经意打开此网页时,这些恶意代码会注入到用户的浏览器中并执行,从而使用户受到攻击。一般而言,利用跨站脚本攻击,攻击者可窃取会话 Cookie,从而获得用户的隐私信息,甚至包括密码等敏感信息。
下面的视频演示了防御 CSRF 攻击的操作过程:98
SQL 注入是网站存在最多也是最简单的漏洞,主要原因是程序员在开发用户和数据库交互的系统时没有对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入精心构造的字符串去非法获取到数据库中的数据。SQL 注入是一种注入攻击,可以执行恶意 SQL 语句。它通过将任意 SQL 代码插入数据库查询,使攻击者能够完全控制 Web 应用程序后面的数据库服务器。攻击者可以使用 SQL 注入漏洞绕过应用程序安全措施;可以绕过网页或 Web 应用程序的身份验证和授权,并检索整个 SQL 数据库的内容;还可以使用 SQL 注入来添加,修改和删除数据库中的记录。有一个经典的例子如下:一个网站后台管理系统存在 SQL 注入漏洞。它使用 url 传递的参数 username 和 password 去数据库校验对应的用户名和密码是否正确,形成的 SQL 语句如下:SELECT * FROM user WHERE username='admin' AND password='passwd'如果后台服务对输入的用户名和密码做任何处理,前台直接构造用户名为:’ or 1=1#。此时后台形成的查询 SQL 语句为:SELECT * FROM user WHERE username='' or 1=1#' AND password='xxx'这条语句也是可以执行的,而且可以得到所有的用户记录。因为 “or 1” 让 SQL 的查询条件永远为 True,而 ‘#’ 屏蔽了后面的密码校验。早期这种后台管理系统的漏洞屡见不鲜。很多人只需要通过黑客工具找到存在 SQL 注入漏洞的后台管理系统,然后使用这个万能密码就能直接进入网站的管理系统页面,达到入侵的目的。SQL 注入攻击方式主要有以下三种:带内注入:攻击者可以通过相同的通信通道发起攻击并获得结果,主要通过以下两种方式完成。基于错误的SQL注入:从显示的错误消息中获取有关数据库的信息基于联合的SQL注入:依赖于攻击者能够将UNION ALL被盗信息的结果与合法结果连接起来盲注入:也称为推理SQL注入;带外注入:攻击者通过精心制作的 SQL 语句注入到数据库,可以触发数据库系统创建与攻击者控制的外部服务器的连接。通过这种方式,攻击者可以收集数据或可能控制数据库的行为。对于 SQL 的注入攻击,在开发 Web 系统时只需要遵循以下几点建议,就能避免绝大部分的 SQL 注入漏洞了:避免将用户提供的输入直接放入 SQL 语句中,最好使用准备好的语句和参数化查询;不要将敏感数据保留在纯文本中;限制数据库权限和特权;避免直接向用户显示数据库错误。大部分的时候,我们需要拦截相关异常,然后定制化输出数据库异常信息;对访问数据库的Web应用程序使用Web应用程序防火墙(WAF);及时更新数据库至最新版,防止黑客利用旧版本漏洞发起攻击。
下面的视频演示了 CSRF 攻击的操作过程:97
CSRF 是跨站点请求伪造 (Cross—Site Request Forgery),存在巨大的危害性,本节讲解 CSRF 攻击和防御的原理。
发动 CSRF 攻击的步骤如下图所示:2.2.1 登录受害者使用用户名、密码登录银行网站。2.2.2 验证通过银行网站根据用户名、密码查询数据库,如果匹配,则在 Session 中记录用户已经通过身份验证。银行网站提供了转账的功能,在实现转账功能时,首先在 Session 中检查是用户是否是登录用户,如果是登录用户,则允许执行转账操作;如果不是登录用户,则不允许执行转账操作。2.2.3 被诱导攻击者创办了一个恶意网站,提供一些吸引人的内容(例如:色情、赌博、盗版小说等信息),诱导受害者访问恶意网站。2.2.4 恶意 HTML当受害者访问恶意网站时,恶意网站传输给受害者一段恶意的 HTML 代码,恶意的 HTML 代码向银行发起转账请求,代码可能如下:<form action='http://www.bank.com/transfer' method='post'> <input type="text" name="name" value="hacker" placeholder="收款账户"/> <input type="text" name="amount" value="100" placeholder="转账数量"/> <input type="submit" id="submit" value="转账"> </form><script>var submit = document.getElementById('submit');submit.click();</script>在第 1 行,定义了一个向银行网站提出转账请求的表单,通过 POST 方法向页面 http://www.bank.com/transfer’ 提出转账请求。在第 2 行,定义了一个名称为 ‘name’、值为 ‘hacker’ 的文本字段,表示转账的收款账户是 ‘hacker’。在第 3 行,定义了一个名称为 ‘amount’、值为 ‘100’ 的文本字段,表示转账的数量是 100。在第 8 行和第 9 行,找到提交按钮,模拟提交按钮的 click 操作,实现了自动提交表单。即:用户浏览器访问这段恶意的 HTML 代码后,会自动向银行网站发出转账 100 元的请求。显然,这次转账不是受害者用户的本意,是攻击者伪造的用户请求。2.2.5 转账受害者的浏览器收到恶意的 HTML 后,执行恶意的 HTML 中的 Javascript 代码,自动向银行提出了一个转账请求。银行网站收到转账请求后进行处理,如果受害者没有退出银行网站的登录,此次转账请求可以通过身份验证,可以正常完成转账的功能。通过以上的 5 个步骤,攻击者成功的挟制了受害者,在当前已登录的银行网站上执行非本意的转账操作。
CSRF 是英文 Cross Site Request Forgery 的缩写,中文翻译为 “跨站请求伪造”,它是一种挟制用户在当前已登录的 Web 应用程序上执行非本意的操作的攻击方法。用户使用浏览器登录网站,通过身份验证后,来自该浏览器的请求会得到授权:在服务端可以执行新增数据、修改数据、删除数据等操作。但是,这样的身份验证机制存在一个漏洞:只能保证请求发自某个登录用户的浏览器,却不能保证请求本身是用户自愿发出的。攻击者利用身份验证漏洞可以挟制用户在当前已登录的 Web 应用程序上执行非本意的操作。
大家好,今天我们开始一个新专题 — Android Studio。 Android Studio 是 Android 应用开发中使用最广泛的集成开发环境 (IDE),凭借 Google 官方出品的身份,以及不停的迭代新功能,不断优化用户体验,目前已经牢牢占据 Android IDE 届“头把交椅”。这个专题我们主要讲解 Android Studio 在应用开发过程中的使用方法。本文我们先主要介绍一下 Android Studio 是什么? 为什么要使用 Android Studio? Android Stuido 开发应用的基本流程? Android Studio 的特色功能?
我们用一个实例演示「CSRF」攻击的过程。假设我们登陆了一个银行网站(bank.example.com),这个网站的作用是实现跨行转账的表单提交,通常情况下,我们会生成如下一个 Form 表单。<form method="post" action="/transfer"> <!-- 汇款金额 --> <input type="text" name="amount"/> <!-- 汇款路由号 --> <input type="text" name="routingNumber"/> <!-- 汇款账户 --> <input type="text" name="account"/> <input type="submit" value="提交"/></form>那我们发出的「post」请求格式可能如下:POST /transfer HTTP/1.1Host: bank.example.comCookie: JSESSIONID=randomidContent-Type: application/x-www-form-urlencodedamount=100.00&routingNumber=1234&account=9876此时,如果我们未登出,并且访问了其他恶意网站,并且其他恶意网站同样包含了可提交的表单,表单形式如下:<form method="post" action="https://bank.example.com/transfer"> <!-- 隐藏项不可见,转账金额,固定 100 元 --> <input type="hidden" name="amount" value="100.00"/> <!-- 隐藏项不可见,转账路由码 --> <input type="hidden" name="routingNumber" value="evilsRoutingNumber"/> <!-- 隐藏项不可见,转账账户 --> <input type="hidden" name="account" value="evilsAccountNumber"/> <!-- 可见 --> <input type="submit" value="快来点我!"/></form>当我们很好奇,点击了「快来点我」按钮时,我们会触发转账请求,并将钱汇款到一个未知账户里。在这个过程中,虽然恶意网站并不知道我们的「Cookies」值,但是由于未登出,我们和银行网站之间的 Cookies 还在,所以当我们再次发起请求时,该 Cookies 依然有效,这使得不知不觉被触发的转账请求同样有效。除此之外,如果恶意网站使用 JS 脚本自动提交表单的话,用户可能没有任何被攻击的感觉。
Android 一词的本意指“人形机器人”,安迪•鲁宾 (Andy Rubin) 在 2003 年以此名创办了 Android 公司并开始召集团队研发 Android 系统。后于 2005 年被 Google 收购,安迪•鲁宾随后任 Google 工程部副总裁,继续负责 Android 项目的研发工作。安卓系统(Android)是一款基于 Linux 内核的自由开源的操作系统,主要使用于移动设备,如智能手机和平板电脑。 Google 在 2007 年 11 月 5 日正式对外公布的了这款系统,并以“绿色机器人”的形状作为其 Logo。早期由 Google 开发,后由开放手机联盟(Open Handset Alliance)负责开发。
本节课程主要介绍 Android Studio 项目的概念及项目相关操作。什么是 Android Studio 项目?项目模块的概念是什么? Android Studio 项目的目录结构是怎样的?如何新建一个项目,项目常用配置有哪些?
接下来就要用到上面下载的 Android sdk manager 了,打开 Eclipse 的设置面板,在左侧找到“Android”卡片,如图设置:在安装完 ADT 之后,可以看到 Eclipse 面板上会多出一些用于 Android 开发的工具,找到“SDK Manager”,通过“SDK manager”我们可以很方便的管理 Android SDK。点击 icon 启动 SDK Manager,如图选择一个 Android 版本,开始安装:注意:如果下载成功可跳过此步。这里可能会由于服务器连接失败导致无法下载,那么需要设置一个代理服务器。进入 sdk manger 的设置页面进行如下配置:设置完成就可以进行安装了,整个下载时间可能会比较长。
Android Studio 是基于 IntelliJ IDEA 而来,且适用于开发 Android 应用的官方集成开发环境 (IDE)。无论你要针对 Android 手机、Wear OS by Google 谷歌、Android TV、Android Auto 还是 Android Things 开发应用,Android Studio 都可以胜任,并且 Android Studio 包含每个开发阶段要用到的所有功能。通过上面的介绍,说白了,Android Studio 就是 Google 为 Android 应用开发提供的官方集成开发环境。
ImageView 和 TextView 一样是直接继承自 View 的基础控件,顾名思义,TextView 用来展示文本,那 ImageView 就是用来展示图片的了。因为 Android 碎片化严重,在 Android 中图片很容易使用但是却很难控制。不同的机型有不同的屏幕尺寸,导致对图片的适配要求很高。但是 Android 系统为我们提供了强大的图片控件,学好 ImageView 是做好 Android UI 适配的第一步。
Android 应用模块为应用的源代码、资源文件和应用级设置(例如模块级构建文件和 Android 清单文件)提供容器。当你创建新项目时,默认的模块名称是“app”。在 Create New Module 窗口中,Android Studio 提供了以下类型的应用模块:手机和平板电脑模块;Wear OS 模块;Android TV 模块;Automotive 模块。Tips:其中每个模块都提供适合相应应用或设备类型的基本文件和一些代码模板
从这篇文章开始我们将进入 Kotlin 用于一些平台的开发,比如 Android、iOS、Web 以及服务端应用程序的开发。我们都知道 Kotlin 这门语言是借助 Android 进入了我们视野的,自从 2019 年 Google IO 大会上宣布 Kotlin 成为了 Android 开发的一级语言后,Google 官方力推 Kotlin,包括很多官方库和 Google APP 都采用 Kotlin 来开发。此外 Android 熟知的第三方库比如 OkHttp 都全部使用 Kotlin 重写了,可知 Kotlin 在 Android 中地位已经到了语言一等公民了。那么这篇文章,将从 0 到 1 带领大家使用 Kotlin 开发 Android 应用程序。
这一节我们将会学习 基于 Android Studio 搭建 Kotlin 的开发环境,这一节也是搭建开发环境的最后一个小节。这一小节重点是安装 Android Studio,不过不用担心,慕课教程也有比较详细的 Android Studio 教程,如果在安装过程中有什么疑问,可以去查看一下。好了,下面我们就正式开始本节课程的学习了。
在 Groovy 中定义映射 (MAP) 和 List 类似使用[]并且要指明它的键 (key)和值 (value),默认的实现类为java.util.LinkedHashMap.class Example { static void main(String[] args) { //1 映射的定义 def swordsman = [one:'张三丰',two:'金毛狮王谢逊',three:'张无忌'] //2 映射的使用 println swordsman['one'] println swordsman.get('two') println swordsman.three //3 添加元素 swordsman.four = '成坤' println swordsman //4 groovy中,可以添加一个复杂的元素,比如添加一个map swordsman.five = [a:1,b:2] println swordsman };}------------------输出----------------------张三丰金毛狮王谢逊张无忌[one:张三丰, two:金毛狮王谢逊, three:张无忌, four:成坤][one:张三丰, two:金毛狮王谢逊, three:张无忌, four:成坤, five:[a:1, b:2]]--------------------------------------------我们从上面的代码中看到,Groovy 定义 MAP 时必须要指定它的键和值,包括新增元素时也要明确键和值,但是它的值可以是任意类型,可以是数字、字符串、列表,也可以是 MAP。
前面的小节我们学习了 Android 模拟器工具。本小节我们学习 Android 分析工具。
Android Studio 是 Google 官方推出的并一直长期更新维护的 IDE,运行速度快,UI更漂亮,集成了智能代码编辑器和强大的 UI 编辑器,整合了 Gradle 构建工具,整合了模拟器,提供了一系列性能分析工具,更完善的插件系统等。
Android App 模板有4个标签:General,Miscellaneous,Debugger,Profiling。
要从 Android Studio 打开 SDK 管理器,请依次点击 Tools > SDK Manager 或点击工具栏中的 SDK Manager 图标SDK 管理器打开后的界面如下图:上图显示了两大部分内容:SDK 安装目录和三个标签页。Android SDK Location:表示 SDK 在本地的安装目录;SDK Platforms:列表显示 SDK 中支持的 Android 平台版本;SDK Tools:列表显示 SDK 支持的软件包;SDK Update Sites:列表显示 SDK 工具网站。已安装的软件包,其前面的复选框会显示打钩。已安装的软件包如有更新,其前面的复选框中会显示短划线图标。要更新某个软件包或安装新软件包,请点击复选框使其显示对勾。要卸载某个软件包,请点击以清除对应复选框。
首先打开 Eclipse,在菜单栏依次选择“New” -> “Android App Project”。如果是第一次创建,可能没有“Android App Project”,那么可以选择“Other”->“Android”。主要有三个参数需要我们设置:应用名: 即我们App的名字,也是最终会显示在设备桌面上的名称;工程名: 项目工程的名字,Eclipse会按照此名称在本地创建工程目录,并将工程文件保存在此目录下;包名: App 的唯一 ID,Android 系统用包名区分不同的 App在这里可以有一个简单的理解,应用名更多是面向用户的,工程名更多是面向 Eclipse 的,而包名是面向 Android 系统的。设置好并选择对应的 Android 版本,点确认后即完成工程的创建。
在学习 Android 应用开发之前,我们先要完成环境的搭建,它将帮助我们将 Java 代码编译打包生成最终的 Android 安装包。本教程在 Mac 下完成安装,Windows 和 Linux 步骤类似,不同之处会着重区分。
默认情况下,Android Studio 会在 Android 视图中显示你的项目文件。此视图并不能反映磁盘上的实际文件层次结构,而是按模块和文件类型进行整理,以简化项目的关键源文件之间的导航方式,并隐藏某些不常用的文件或目录。与磁盘上的结构相比,一些结构变化包括以下方面:在顶级 Gradle Script 组中显示相应项目的所有与编译相关的配置文件;在模块级组中显示每个模块的所有清单文件(当你针对不同的产品类型和编译类型使用不同的清单文件时);在一个组(而非在每个资源限定符的单独文件夹)中显示所有备用资源文件。例如,你的启动器图标的所有密度版本都可以并排显示。在 Android 视图下的项目结构如下:manifests:包含 AndroidManifest.xml 文件;java:包含 Java 源代码文件(以软件包名称分隔各文件,包括 JUnit 测试代码);res:包含所有非代码资源(例如 XML 布局、界面字符串和位图图像),这些资源划分到相应的子目录中。