<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Xss on Wayne's blog | 偉恩的部落格 | 技術博客</title><link>https://blog.wayne-project.com/tags/xss/</link><description>Recent content in Xss on Wayne's blog | 偉恩的部落格 | 技術博客</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Fri, 21 Oct 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.wayne-project.com/tags/xss/index.xml" rel="self" type="application/rss+xml"/><item><title>NodeJS 防止 xss 攻擊</title><link>https://blog.wayne-project.com/2022-10-21/nodejs-prevent-xss/</link><pubDate>Fri, 21 Oct 2022 00:00:00 +0000</pubDate><guid>https://blog.wayne-project.com/2022-10-21/nodejs-prevent-xss/</guid><description>&lt;img src="https://live.staticflickr.com/65535/52442821071_35fc2e7087_o.png" alt="Featured image of post NodeJS 防止 xss 攻擊" /&gt;&lt;style&gt;
.article-content p code {
background-color: #f5f5f5;
color: #ff3860;
}
.focus {
background: #f1e2e2;
color: #d62c2c;
padding: 0 5px;
}
&lt;/style&gt;
&lt;p&gt;&lt;a class="link" href="https://juejin.cn/post/7112204639029690381" target="_blank" rel="noopener"
&gt;參考網站&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="簡介"&gt;簡介&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;xss&lt;/code&gt; 是常見的攻擊方式之一，不管是前端還是後端都要對此有所防範才行。&lt;br&gt;
本文主要講解使用 &lt;code&gt;NodeJS&lt;/code&gt; 開發的後端程序應該如何防範 &lt;code&gt;xss&lt;/code&gt; 攻擊。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="xss演示"&gt;xss演示&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;xss&lt;/code&gt; 攻擊方式主要是在在頁面展示內容中摻雜 &lt;code&gt;js代碼&lt;/code&gt;，以獲取網頁信息。&lt;/p&gt;
&lt;p&gt;常見的攻擊地方有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;電商產品評價區：某用戶提交的評價帶有&lt;code&gt;可執行的js代碼&lt;/code&gt;，其他用戶查看該評論時就會執行那段&lt;code&gt;js代碼&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;博客網站：某用戶在博客的標題或者內容中帶有&lt;code&gt;可執行的js代碼&lt;/code&gt;，其他用戶查看該博客時那段 &lt;code&gt;js代碼&lt;/code&gt; 就會被執行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;比如在輸入框輸入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="p"&gt;)&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;別的用戶在自己頁面要展示上面這段內容個，頁面有可能會彈出一個彈窗。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;這個例子只是彈出一個對話框，如果人家有惡意，獲取cookie 等信息，然後傳給自己的服務器，那後果真的很嚴重。&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="xss防禦"&gt;xss防禦&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;預防措施：轉義特殊字符&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;特殊符號轉換&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;amp; -&amp;gt; &amp;amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt; -&amp;gt; &amp;amp;lt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; -&amp;gt; &amp;amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34; -&amp;gt; &amp;amp;quot;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#39; -&amp;gt; &amp;amp;#x27;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/ -&amp;gt; &amp;amp;#x2F;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上面我羅列了幾個常見的特殊字符。從上面的例子可以看出，輸入了 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 標籤後，裡面的內容有可能會被執行。&lt;br&gt;
如果我們把 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 改成 &lt;code&gt;&amp;amp;lt;script&amp;amp;gt;&lt;/code&gt; 那麼瀏覽器就不把這段內容看成是可執行代碼。&lt;/p&gt;
&lt;p&gt;在日常開發中，我們不需要自己編寫轉義功能的代碼，只需要下載 &lt;code&gt;xss&lt;/code&gt; 的依賴包就行。&lt;/p&gt;
&lt;p&gt;安裝 &lt;code&gt;xss&lt;/code&gt; 依賴包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install xss --save
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;使用 &lt;code&gt;xss&lt;/code&gt;。 &lt;code&gt;xss&lt;/code&gt; 其實是一個方法，只需要把要轉義的內容傳入 &lt;code&gt;xss&lt;/code&gt; 方法即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xss&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;xss&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;script&amp;gt;alert(1234)&amp;lt;/script&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;最後輸出&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-perl" data-lang="perl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ow"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ow"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="n"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1234&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ow"&gt;lt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ow"&gt;gt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以上就是 &lt;code&gt;xss攻擊&lt;/code&gt; 在後端的防禦方法。&lt;/p&gt;
&lt;p&gt;如果嚴謹一點的話，在前端也可以把文本域的內容裡的特殊字符轉義一遍再傳給後端。&lt;/p&gt;
&lt;p&gt;後端傳給前端的內容有可能會在頁面展示成 &lt;code&gt;&amp;amp;lt;script&amp;amp;gt;alert(1234)&amp;amp;lt;/script&amp;amp;gt;&lt;/code&gt;，這部分需要前端自己去處理。&lt;/p&gt;
&lt;p&gt;插則花邊新聞&lt;/p&gt;
&lt;p&gt;之前看到有則新聞說 &lt;code&gt;Vue&lt;/code&gt; 不安全，某些ZF項目中使用 &lt;code&gt;Vue&lt;/code&gt; 受到了 &lt;code&gt;xss&lt;/code&gt; 攻擊。後端甩鍋給前端，前端甩鍋給了 &lt;code&gt;Vue&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;後來聽說是前端胡亂使用 &lt;code&gt;v-html&lt;/code&gt; 渲染內容導致的，而 &lt;code&gt;v-html&lt;/code&gt; 這東西官方文檔也提示了有可能受到 &lt;code&gt;xss&lt;/code&gt; 攻擊。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尤雨溪：很多人就是不看文檔&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://live.staticflickr.com/65535/52443102169_2094784350_o.png"
max-width="100%"
max-height="100%"
class="gallery-image"
loading="lazy"
&gt;&lt;/p&gt;
&lt;hr&gt;</description></item></channel></rss>