目錄
2. XSS" >2. XSS
你输入的内容: {{{text}}}h2>
首頁 運維 安全 常見的web安全面試問題(分享)

常見的web安全面試問題(分享)

Nov 29, 2019 pm 05:37 PM
web安全 面試

之前出去面试的时候, 经常会被问到一些安全方面的问题。安全涉及的领域很大, 我也仅仅是了解一些皮毛, 每次面试前都要找资料复习, 很麻烦。所以我就根据之前搜集的一些资料和面试的经验,系统的梳理了一下,希望对大家有所帮助。

常見的web安全面試問題(分享)

首先简单介绍几种常见的攻击方式:

1、SQL注入

2、XSS

3、CSRF

4、点击劫持

5、中间人攻击

1. SQL 注入

这是一种比较简单的攻击方式。

如果后台人员使用用户输入的数据来组装SQL查询语句的时候不做防范, 遇到一些恶意的输入, 最后生成的SQL就会有问题。

常見的web安全面試問題(分享)

比如地址栏输入的是:

articlrs/index.php?id=1

发送一个get请求, 调用的查询语句是:

sql = "SELECT * FROM articles WHERE id =", $id

正常情况下, 返回 id = 1 的文章。

如果攻击者想获得所有的文章,语句就可以改成:

articlrs/index.php?id=-1 OR 1 = 1

这样就可以了, 为什么呢?

这是因为,id = -1 永远是 false,1=1 永远是true,所有整个where语句永远是ture.

所以 where 条件相当于没有加where条件,那么查询的结果相当于整张表的内容,攻击者就达到了目的。

现在的系统一般都会加入 过滤 和  验证 机制, 可以有效预防SQL注入问题。

2. XSS

XSS 全称是跨站脚本攻击

通过代码注入的方式来达到攻击的目的。

常見的web安全面試問題(分享)

我们有个社交网站,允许大家相互访问空间,网站可能是这样做的:

登入後複製
           input>  form>

你输入的内容: {{{text}}}h2>

常見的web安全面試問題(分享)

如果你用的是Chrome浏览器, 会得到来自浏览器的警告:

常見的web安全面試問題(分享)

Chrome 这类浏览器能自动帮助用户防御攻击, 很贴心。

但是也不是说, 只要我用Chrome就万事大吉了,该防御, 还得防御。

常見的web安全面試問題(分享)

对于 XSS 攻击,通常来说,有两种方式可以防御:

1、字符转译

2、CSP(Content Security Policy)

1.字符转译

做法就是转义输入输出的内容,对于引号、尖括号、斜杠等字符进行转义。

& 替换为:&
<p>通过转义可以将攻击代码 :</p><pre class="brush:php;toolbar:false"><script>alert(&#39;1&#39;)script></script>
登入後複製

转译成:

<script>alert(1)</script>
登入後複製

替换了这些字符之后,恶意代码就会失效,XSS 攻击将不会轻易发生。

对于一般的输入, 可以像上面那样粗暴的转译。

有些情况, 光转译也是不够的,比如:

<a>点我a></a>
登入後複製

常見的web安全面試問題(分享)

链接中如果存在 javacript: 开头的协议,点击链接时浏览器会执行后面的代码。

这个时候光转义是没有用的,需要对 url 协议进行白名控制,只允许 http, https, http, mailto安全协议

包括图片 src 属性 img src="{{xss}}", iframe iframe src="{{xss}}" 都会存在这样的问题,都需要白名单处理

但是别的一些情况, 比如,富文本,这时候就不能这么干了。

如此粗暴的转译会破坏掉原有的格式

这种情况, 比较合适的策略是使用白名单进行过滤标签属性

简单总结一下:

常見的web安全面試問題(分享)

说完字符转译, 我们再看看CSP。

2.CSP

CSP , Content Security Policy

本质也是白名单,通过设置白名单, 我们可以设置允许浏览器加载哪些外部资源

要开启CSP可以通过两种方式:

1、设置 HTTP Header 中的 Content-Security-Policy

2、设置 meta 标签的方式

常見的web安全面試問題(分享)

只要配置了正确的规则,那么即使网站存在漏洞,恶意代码也不会被执行。

CSP的兼容性:

常見的web安全面試問題(分享)

CSP 文档地址:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy

3. CSRF

CSRF  全称是跨站请求伪造( Cross Site Request Forgery)

本质上, 说白了就是借用用户的身份权限偷偷的完成某些操作。

CSRF 的发生其实是借助了 cookie 的特性。

常見的web安全面試問題(分享)

我们登录了某个 http://tao.com 购物网站之后,cookie 就会有登录过的标记了。

此时请求http://tao.com/pay?id=123&money=1000, 是会带着 cookie 的,server 端就知道已经登录了。

如果在http://tao.com去请求其他域名的 API ,  例如http://tx.com/api时,是不会带 cookie 的,这是浏览器同源策略的限制。

但是此时在其他域名的页面中,请求http://tao.com/pay?id=123&money=1000,就会带着tao.com的 cookie 。

这是发生 CSRF 攻击的理论基础。

如何防御CSRF

防御CSRF 有效的手段就是加入各个层级的权限验证.

例如现在的购物网站,只要涉及现金交易,肯定要输入密码或者扫码验证才行。

除此之外,敏感的接口要使用POST请求而不是GET.

4.点击劫持

click-jacking,也被称为UI-覆盖攻击

这也是比较常问到的一个问题,也是我们最常见的一种情况。

攻击方式就是在某些操作的按钮上加一层透明的iframe

点击一下, 就入坑了。

如何防御点击劫持

常用的两种方式:

1. 使用 HTTP 头防御

通过配置 nginx 发送 X-Frame-Options 响应头.

这个 HTTP 响应头 就是为了防御用 iframe 嵌套的点击劫持攻击。

这样浏览器就会阻止嵌入网页的渲染

该响应头有三个值可选,分别是:

  1. DENY,表示页面不允许通过 iframe 的方式展示。
  2. SAMEORIGIN,表示页面可以在相同域名下通过 iframe 的方式展示。
  3. ALLOW-FROM,表示页面可以在指定来源的 iframe 中展示。

更详细的可以查阅 MDN 上关于 X-Frame-Options 响应头的内容。

2. 使用 Javascript 防御

判断顶层视口的域名是不是和本页面的域名一致,如果不一致就让恶意网页自动跳转到我方的网页。

if (top.location.hostname !== self.location.hostname) {    
    alert("您正在访问不安全的页面,即将跳转到安全页面!")   
    top.location.href = self.location.href;
 }
登入後複製

5. 中间人攻击

中间人攻击(Man-in-the-Middle Attack, MITM)是一种由来已久的网络入侵手段.

如 SMB 会话劫持、DNS 欺骗等攻击都是典型的MITM攻击。

简而言之,所谓的MITM攻击就是通过拦截正常的网络通信数据,并进行数据篡改嗅探来达到攻击的目的,而通信的双方却毫不知情。

如何防御中间人攻击

以下是针对防止中间人攻击的一些建议:

1、确保当前你所访问的网站使用了HTTPS

2、如果你是一个网站管理员,你应当执行HSTS协议

3、不要在公共Wi-Fi上发送敏感数据

4、如果你的网站使用了SSL,确保你禁用了不安全的SSL/TLS协议。

5、不要点击恶意链接或电子邮件。

还有一个容易被<span style="font-size: 20px;">忽略</span>的漏洞

window.opener

带有 target="_blank" 跳转的网页拥有了浏览器 window.opener 对象赋予的对原网页的跳转权限,这可能会被恶意网站利用.

例如一个恶意网站在某 UGC 网站 Po 了其恶意网址,该 UGC 网站用户在新窗口打开页面时,恶意网站利用该漏洞将原 UGC 网站跳转到伪造的钓鱼页面,用户返回到原窗口时可能会忽视浏览器 URL 已发生了变化,伪造页面即可进一步进行钓鱼或其他恶意行为:

代码如下:

<script>
  window.opener.location = &#39;https://example.com&#39;
script></script>
登入後複製

想象一下,你在浏览淘宝的时候,点击了网页聊天窗口的一条外链,出去看了一眼,回来之后淘宝网已经变成了另一个域名的高仿网站,而你却未曾发觉,继续买东西把自己的钱直接打到骗子手里。

如何修复

为 target="_blank" 加上 rel="noopener noreferrer" 属性。

<a>外跳的地址a></a>
登入後複製

缺点:  为禁止了跳转带上 referrer,目标网址没办法检测来源地址

还有一种方法是,所有的外部链接都替换为内部的跳转连接服务,点击连接时,先跳到内部地址,再由服务器 redirect 到外部网址。

现在很多站点都是这么做的, 不仅可以规避风险,还可以控制非法站点的打开:

"/redirect?target=http%3A%2F%2Fxxx.yyy.com">
http://xxx.yyy.com

大概就是这么多。

总结

上文介绍了了一些常见的前端安全方面的知识及如何防御这些攻击,应对面试的话,基本上也算够用了。

安全的领域很大,上面我只是粗浅的介绍了一个方面,如果大家对于安全这一块有兴趣的话,可以找一些相关资料继续研究。

文中若有谬误, 还请各位大佬指正。

以上是常見的web安全面試問題(分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

聊聊如何選擇一個最好的Node.js Docker映像? 聊聊如何選擇一個最好的Node.js Docker映像? Dec 13, 2022 pm 08:00 PM

選擇一個Node的Docker映像看起來像是小事,但是映像的大小和潛在漏洞可能會對你的CI/CD流程和安全造成重大的影響。那我們要如何選擇一個最好Node.js Docker映像呢?

如何解決跨域?常見解決方案淺析 如何解決跨域?常見解決方案淺析 Apr 25, 2023 pm 07:57 PM

跨域是開發中常會遇到的場景,也是面試中常會討論的問題。掌握常見的跨域解決方案及其背後的原理,不僅可以提高我們的開發效率,還能在面試中表現的更加

golang框架面試題集錦 golang框架面試題集錦 Jun 02, 2024 pm 09:37 PM

Go框架是一組擴充Go內建程式庫的元件,提供預製功能(例如網路開發和資料庫操作)。受歡迎的Go框架包括Gin(Web開發)、GORM(資料庫操作)和RESTful(API管理)。中間件是HTTP請求處理鏈中的攔截器模式,用於在不修改處理程序的情況下新增身份驗證或請求日誌記錄等功能。 Session管理透過儲存使用者資料來保持會話狀態,可以使用gorilla/sessions管理session。

Java JPA 面試題精選:檢視你的持久化框架掌握程度 Java JPA 面試題精選:檢視你的持久化框架掌握程度 Feb 19, 2024 pm 09:12 PM

什麼是JPA?它與JDBC有什麼不同? JPA(JavaPersistenceapi)是一個用於物件關係映射(ORM)的標準接口,它允許Java開發者使用熟悉的Java物件來操作資料庫,而無需編寫直接針對資料庫的sql查詢。而JDBC(JavaDatabaseConnectivity)是Java用來連接資料庫的標準API,它需要開發者使用SQL語句來操作資料庫。 JPA將JDBC封裝起來,為物件-關聯映射提供了更方便、更高層級的API,簡化了資料存取操作。在JPA中,什麼是實體(Entity)?實體

一文理解JavaScript中的單例模式 一文理解JavaScript中的單例模式 Apr 25, 2023 pm 07:53 PM

JS 單例模式是常用的設計模式,它可以保證一個類別只有一個實例。這種模式主要用於管理全域變量,避免命名衝突和重複加載,同時也可以減少記憶體佔用,提高程式碼的可維護性和可擴展性。

如何使用Nginx保護網路應用程式並減少攻擊面 如何使用Nginx保護網路應用程式並減少攻擊面 Jun 10, 2023 am 08:36 AM

近年來,隨著Web應用的不斷普及和用戶量的增加,Web應用程式遭受網路攻擊的風險日益增加。駭客利用漏洞,嘗試入侵和破壞Web應用程序,可能導致資料外洩、伺服器癱瘓、惡意軟體感染和金融損失等嚴重後果。為了保護網路應用程式並減少攻擊面,Nginx是一種優秀的解決方案。 Nginx是一種高效能、開源的Web伺服器軟體,它可以充當Web負載平衡器、反向代理伺服器和H

Nginx模組與物件類型在Web安全性中的應用 Nginx模組與物件類型在Web安全性中的應用 Jun 10, 2023 am 09:33 AM

隨著網路和Web應用的發展,網路安全已經成為了一個重要的議題。 Web應用程式安全問題的風險日益增加,使安全性成為了開發人員和網站管理員的首要任務。在這個環境下,Nginx模組和物件類型在Web安全中扮演著至關重要的角色。 Nginx是一個高效能的Web伺服器和反向代理伺服器。它可以同時處理數千個並發連接,同時擁有佔用資源少、高穩定性和可擴展性等優點。 Nginx

JavaScript怎麼判斷資料型別? 8 種方式分享 JavaScript怎麼判斷資料型別? 8 種方式分享 Feb 16, 2023 pm 02:48 PM

JavaScript怎麼判斷資料型別?這篇文章跟大家分享JS 判斷資料類型的 8 種方式,有效幫助工作和麵試,面試官看了微微一笑。

See all articles