<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>security Archives - Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/tag/security/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/tag/security/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Wed, 03 Jan 2024 08:43:51 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>security Archives - Tomoshare</title>
	<link>https://blog.tomosia.com.vn/tag/security/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Authentication Google with NextJS and NextAuth</title>
		<link>https://blog.tomosia.com.vn/authentication-google-with-nextjs-and-nextauth/</link>
					<comments>https://blog.tomosia.com.vn/authentication-google-with-nextjs-and-nextauth/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Wed, 03 Jan 2024 08:02:37 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[ReactJS]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[javascript]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3007</guid>

					<description><![CDATA[<p>Authentication Hướng dẫn này trình bày quy trình đơn giản trong việc kết hợp xác thực vào ứng&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/authentication-google-with-nextjs-and-nextauth/">Authentication Google with NextJS and NextAuth</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Authentication</p>



<p>Hướng dẫn này trình bày quy trình đơn giản trong việc kết hợp xác thực vào ứng dụng Next.js của bạn bằng thư viện next-auth. Mặc dù thư viện cung cấp nhiều tùy chọn (nhà cung cấp), hướng dẫn này tập trung vào việc triển khai bằng cách sử dụng Nhà cung cấp Google.</p>



<p>Về hướng dẫn này, mọi người cũng sẽ hiểu rõ hơn về việc dễ dàng thiết lập các tuyến được bảo vệ trong ứng dụng của mình, một nhiệm vụ được thư viện next-auth này thực hiện dễ dàng.</p>



<p></p>



<h4 id="thiet-lap-thu-vien-next-auth" class="wp-block-heading">Thiết lập thư viện next-auth</h4>



<p>Đầu tiên mọi người phải có 1 chiếc project nextjs đã, mọi người có thể tham khảo hướng dẫn trên trang chủ của Nextjs tại đây, hướng dẫn quá chi tiết: <a href="https://nextjs.org/docs/getting-started/installation">https://nextjs.org/docs/getting-started/installation</a></p>



<p>Cài đặt thư viện next-auth bằng lệnh sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="npm install next-auth" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">npm</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">install</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">next-auth</span></span></code></pre></div>



<p>Sau khi hoàn tất cài đặt, hãy tạo thư mục api trong thư mục ứng dụng gốc và bên trong thư mục đó tạo thư mục /auth. Cuối cùng, tạo thư mục [&#8230;nextauth] bên trong thư mục auth đó.</p>



<p>Inside the&nbsp;<code>[...nextauth]</code>&nbsp;folder, create two files named&nbsp;<code>route.ts</code>&nbsp;and&nbsp;<code>options.ts</code>.</p>



<p>Cấu trúc thư mục của mọi người cho đến thời điểm này sẽ trông như thế này:</p>



<figure class="wp-block-image size-full is-resized"><img fetchpriority="high" decoding="async" width="412" height="270" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-15.51.15.png" alt="" class="wp-image-3019" style="width:680px;height:auto" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-15.51.15.png 412w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-15.51.15-300x197.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-15.51.15-380x249.png 380w" sizes="(max-width: 412px) 100vw, 412px" /></figure>



<p>Sau đó, trong tệp options.ts, chèn đoạn mã sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">TypeScript</span><span role="button" tabindex="0" data-code="import type { NextAuthOptions } from 'next-auth'
import GoogleProvider from &quot;next-auth/providers/google&quot;;

export const options: NextAuthOptions = {
    providers: [
  GoogleProvider({
    clientId: process.env.GOOGLE_CLIENT_ID as string,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,
  })
]
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">type</span><span style="color: #F6F6F4"> { NextAuthOptions } </span><span style="color: #F286C4">from</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">next-auth</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> GoogleProvider </span><span style="color: #F286C4">from</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">next-auth/providers/google</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">export</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> options</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">NextAuthOptions</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    providers</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> [</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #62E884">GoogleProvider</span><span style="color: #F6F6F4">({</span></span>
<span class="line"><span style="color: #F6F6F4">    clientId</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> process.env.</span><span style="color: #BF9EEE">GOOGLE_CLIENT_ID</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">as</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">    clientSecret</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> process.env.</span><span style="color: #BF9EEE">GOOGLE_CLIENT_SECRET</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">as</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">string</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">  })</span></span>
<span class="line"><span style="color: #F6F6F4">]</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p>việc bạn có thể thêm nhiều Provider khác sử dụng mạng xã hội các bạn có thể tham khảo tại đây, có hướng dẫn cụ thể như đoạn code <mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-cyan-bluish-gray-color"><code>GoogleProvider</code></mark> trên</p>



<p>Biến <code>options</code> là nơi chúng ta nhúng bất kỳ nhà cung cấp nào chúng tôi dự định sử dụng từ next-auth</p>



<p>Để sử dụng đăng nhập bằng Google một cách hiệu quả, mọi người cần có các thuộc tính clientId và clientSecret của mình. Hãy yên tâm, mình sẽ sớm đi sâu vào vấn đề này. Đầu tiên, tạo tệp .env nơi bạn sẽ gán giá trị cho cả hai thuộc tính đã khai báo bên trên.</p>



<p><strong>lưu ý rằng tạo file .env nên đặt nó ở thư mục gốc để tránh các lỗi có thể sảy ra nếu như không config nó ở trong file config</strong></p>



<p>OK giờ chúng ta cùng đi đến bước setup Google nào!!!</p>



<h3 id="setup-google" class="wp-block-heading">Setup google</h3>



<p>Truy cập trang <a href="https://cloud.google.com/">https://cloud.google.com/</a> và tiến hành tạo mới một project trên đó</p>



<p>Mình sẽ bỏ qua bước tạo project vì hầu như trên mạng cũng đã có rồi, mà mình sẽ hướng dẫn từ bước mọi người đã tạo xong nhé</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="488" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/console-1024x488.png" alt="" class="wp-image-3020" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/console-1024x488.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/console-300x143.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/console-768x366.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/console-380x181.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/console-800x381.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/console-1160x553.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/console.png 1366w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Sau khi tạo xong các bạn sẽ được tới 1 trang như thế này, bấm theo các bước mình đã chụp ở trên, đầu tiên chọn Credentials</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="488" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure-1024x488.png" alt="" class="wp-image-3021" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure-1024x488.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure-300x143.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure-768x366.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure-380x181.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure-800x381.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure-1160x553.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/configure.png 1366w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Sau đó ở màn hình Credentials nhấn chọn button &#8220;CONFIGURE CONSENT SCREEN&#8221;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="488" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/external-1024x488.png" alt="" class="wp-image-3022" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/external-1024x488.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/external-300x143.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/external-768x366.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/external-380x181.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/external-800x381.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/external-1160x553.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/external.png 1366w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Sau khi đã thiết lập cũng như đồng ý các điều khoản thì mọi người sẽ được chuyển tới màn hình như sau:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="488" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth-1024x488.png" alt="" class="wp-image-3023" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth-1024x488.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth-300x143.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth-768x366.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth-380x181.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth-800x381.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth-1160x553.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/oauth.png 1366w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>ở màn hình này chúng ta sẽ chả làm gì cả vì cũng chưa setup gì cho project của mình, chuyển tiếp về lại trang Credentials:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1000" height="476" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/create-id.gif" alt="" class="wp-image-3024"/></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="1000" height="476" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/application.gif" alt="" class="wp-image-3025" style="width:680px;height:auto"/></figure>



<p>nhập các thông tin đầy đủ vào phần Create OAuth client ID:</p>



<p>Cuộn xuống phần &#8220;Authorize redirect URI&#8221; và dán URI sau:<br>http://localhost:3000/api/auth/callback/google. Sau đó bấm nút Create</p>



<p>Trong trường hợp mọi người muốn setup cho production thì thay vì để localhost hãy thay bằng domain của mình</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="488" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/id-1024x488.png" alt="" class="wp-image-3026" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/id-1024x488.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/id-300x143.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/id-768x366.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/id-380x181.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/id-800x381.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/id-1160x553.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/id.png 1366w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Cuối cùng thì id của chúng ta cần đã xuất hiện, việc chúng ta cần làm là đưa 2 id này vào trong phần .env của dự án mình và tiến hành tới bước tiếp theo, test</p>



<p>Mọi người cũng cần tạo key NEXT_AUTH_SECRET để tăng cường tính bảo mật của quy trình xác thực trong next-auth. Mình từng mắc tới việc nếu không thêm key này thì không thể sử dụng tới Google được nên mọi người cứ thêm vào cho chắc nhé. Tạo secret key của mọi người bằng cách thực hiện lệnh sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="openssl rand -base64 32" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">openssl</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">rand</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">-base64</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">32</span></span></code></pre></div>



<p>Lệnh này sẽ tạo ra một chuỗi 32 ký tự. Sao chép chuỗi này và dán nó làm giá trị cho biến NEXTAUTH_SECRET trong tệp .env này. Tệp .env cuối cùng của chúng ta sẽ giống như sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">Bash</span><span role="button" tabindex="0" data-code="GOOGLE_CLIENT_ID = client ID value
GOOGLE_CLIENT_SECRET = client secret value
NEXT_AUTH_SECRET = next auth secret" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #62E884">GOOGLE_CLIENT_ID</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">client</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">ID</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">value</span></span>
<span class="line"><span style="color: #62E884">GOOGLE_CLIENT_SECRET</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">client</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">secret</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">value</span></span>
<span class="line"><span style="color: #62E884">NEXT_AUTH_SECRET</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">=</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">next</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">auth</span><span style="color: #F6F6F4"> </span><span style="color: #E7EE98">secret</span></span></code></pre></div>



<p>Sau khi bạn đã triển khai thành công các biến .env, hãy dán đoạn mã sau vào tệp Route.ts của mình:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">TypeScript</span><span role="button" tabindex="0" data-code="import NextAuth from &quot;next-auth/next&quot;;
import { options } from &quot;./options&quot;;

const handler = NextAuth(options);

export { handler as GET, handler as POST };" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> NextAuth </span><span style="color: #F286C4">from</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">next-auth/next</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F286C4">import</span><span style="color: #F6F6F4"> { options } </span><span style="color: #F286C4">from</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&quot;</span><span style="color: #E7EE98">./options</span><span style="color: #DEE492">&quot;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> handler </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">NextAuth</span><span style="color: #F6F6F4">(options);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">export</span><span style="color: #F6F6F4"> { handler </span><span style="color: #F286C4">as</span><span style="color: #F6F6F4"> GET, handler </span><span style="color: #F286C4">as</span><span style="color: #F6F6F4"> POST };</span></span></code></pre></div>



<p>Điều này đảm bảo rằng các request GET và POST được gửi đến điểm cuối này api/auth/[&#8230;nextauth] sẽ được thư viện next-auth xử lý.</p>



<p>Cuối cùng, hãy khởi động lại ứng dụng nextjs của chúng ta. Điều quan trọng cần lưu ý là thư viện next-auth sẽ không hoạt động ngay vào thời điểm này. Lý do là chúng ta vẫn chưa triển khai protected routes để bảo vệ các trang của mình. Chúng ta sẽ khám phá khía cạnh này tiếp theo.</p>



<h3 id="lam-sao-de-implement-protected-routes-voi-next-auth" class="wp-block-heading">Làm sao để implement Protected Routes với <code>next-auth</code></h3>



<p>Với việc sử dụng middleware của Next.js, việc bảo vệ các routes trở nên rất dễ dàng.</p>



<p>Bắt đầu bằng cách tạo tệp middleware.ts trong thư mục src gốc.</p>



<p>Để bảo vệ tất cả các trang của bạn một cách thống nhất, hãy chèn đoạn mã sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">TypeScript</span><span role="button" tabindex="0" data-code="export { default } from 'next-auth/middleware'" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">export</span><span style="color: #F6F6F4"> { </span><span style="color: #F286C4">default</span><span style="color: #F6F6F4"> } </span><span style="color: #F286C4">from</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">next-auth/middleware</span><span style="color: #DEE492">&#39;</span></span></code></pre></div>



<p>Ngoài ra, mọi người có thể bảo mật riêng các trang cụ thể bằng cách sử dụng <code>matcher</code>. Ví dụ: chỉ bảo vệ trang chủ và cart sẽ được triển khai như sau:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">TypeScript</span><span role="button" tabindex="0" data-code="export { default } from 'next-auth/middleware'

export const config = { matcher: ['/', '/cart'] }" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">export</span><span style="color: #F6F6F4"> { </span><span style="color: #F286C4">default</span><span style="color: #F6F6F4"> } </span><span style="color: #F286C4">from</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">next-auth/middleware</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">export</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">const</span><span style="color: #F6F6F4"> config </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> { matcher</span><span style="color: #F286C4">:</span><span style="color: #F6F6F4"> [</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">/</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">/cart</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">] }</span></span></code></pre></div>



<p>Bây giờ, khi ta truy cập cả hai trang trên localhost của mình, chúng sẽ hiển thị lời nhắc xác thực mời bạn &#8220;Sign in with Google&#8221; thay vì hiển thị nội dung thông thường:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="488" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in-1024x488.png" alt="" class="wp-image-3029" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in-1024x488.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in-300x143.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in-768x366.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in-380x181.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in-800x381.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in-1160x553.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/sign-in.png 1366w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="tong-ket-lai" class="wp-block-heading">Tổng kết lại</h3>



<p>Trong hướng dẫn này, mình đã đề cập đến các bước cần thiết để triển khai authenticate và được protected trong ứng dụng Next.js của bạn bằng thư viện next-auth với Nhà cung cấp Google.</p>



<p>Với kiến ​​thức thu được ở đây, giờ đây mọi người có thể tự tin phát triển các ứng dụng cung cấp khả năng kiểm soát truy cập an toàn và nội dung được cá nhân hóa dựa trên xác thực người dùng.</p>



<p>Mọi người cũng có thể triển khai thêm trên các mạng xã hội khác, ví dụ như Facebook, Instagram, Apple, &#8230;</p>



<p>Mọi người có thể truy cập vào đây để có thể triển khai những nhà cung cấp khác nhé <a href="https://next-auth.js.org/providers/">https://next-auth.js.org/providers/</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="396" height="1024" src="http://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-16.33.39-396x1024.png" alt="" class="wp-image-3030" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-16.33.39-396x1024.png 396w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-16.33.39-116x300.png 116w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-16.33.39-594x1536.png 594w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-16.33.39-380x982.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2024/01/Screen-Shot-2024-01-02-at-16.33.39.png 596w" sizes="auto, (max-width: 396px) 100vw, 396px" /></figure>



<p>có hàng ti tỉ thứ nằm ở đây chờ đón mọi người đó ^^</p>



<p>Sắp tới mình sẽ ra thêm nhiều blog liên quan tới Frontend hơn nữa, sẽ chi tiết hơn nên mọi người nhớ đón chờ nhé</p>
<p>The post <a href="https://blog.tomosia.com.vn/authentication-google-with-nextjs-and-nextauth/">Authentication Google with NextJS and NextAuth</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/authentication-google-with-nextjs-and-nextauth/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Forward proxy vs. Reverse proxy</title>
		<link>https://blog.tomosia.com.vn/forward-proxy-vs-reverse-proxy/</link>
					<comments>https://blog.tomosia.com.vn/forward-proxy-vs-reverse-proxy/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Fri, 08 Dec 2023 03:36:29 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Server]]></category>
		<category><![CDATA[Web server]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2428</guid>

					<description><![CDATA[<p>Trong mạng máy tính, proxy là một máy chủ trung gian giữa client và các server khác trên&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/forward-proxy-vs-reverse-proxy/">Forward proxy vs. Reverse proxy</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Trong mạng máy tính, proxy là một máy chủ trung gian giữa client và các server khác trên Internet. Khi client gửi yêu cầu đến server, request sẽ được gửi đến proxy trước. Sau đó, proxy sẽ gửi request đến server thay cho client và trả về response cho client.</p>



<h2 id="tai-sao-lai-can-co-proxy" class="wp-block-heading">Tại sao lại cần có proxy?</h2>



<p>Thay vì kết nối trực tiếp tới server, client gửi request đến proxy để đánh giá và thực hiện những request đó.</p>



<ul class="wp-block-list">
<li><strong>Bảo vệ quyền riêng tư:</strong>&nbsp;Proxy có thể được sử dụng để ẩn địa chỉ IP của client,&nbsp;giúp bảo vệ quyền riêng tư của người dùng khỏi các trang web và ứng dụng mà họ truy cập.</li>



<li><strong>Cân bằng tải (Load balancing):</strong>&nbsp;Proxy có thể được sử dụng để phân phối lưu lượng truy cập giữa nhiều server,&nbsp;giúp cải thiện hiệu suất và độ tin cậy của hệ thống.</li>



<li><strong>Bảo mật (Security):</strong>&nbsp;Proxy có thể được sử dụng để lọc lưu lượng truy cập,&nbsp;giúp ngăn chặn các cuộc tấn công mạng.</li>



<li><strong>Giảm chi phí:</strong>&nbsp;Proxy có thể được sử dụng để truy cập các tài nguyên từ xa,&nbsp;giúp giảm chi phí cho doanh nghiệp.</li>
</ul>



<p>Có 2 loại proxy thường gặp đó là Forward proxy và Reverse proxy.</p>



<h2 id="forward-proxy" class="wp-block-heading">Forward proxy</h2>



<ul class="wp-block-list">
<li>Là một&nbsp;<em>client proxy</em>, hoạt động thay mặt cho các thiết bị clients để gửi yêu cầu đến server.</li>



<li>Nó <strong>nằm giữa clients và Internet</strong>, chuyển tiếp các requests của clients đến server thông qua Internet.</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-1024x512.png" alt="" class="wp-image-2437" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-1024x512.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-300x150.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-768x384.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-1536x768.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-2048x1024.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-380x190.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-800x400.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/forward_proxy_flow-1160x580.png 1160w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 id="use-cases" class="wp-block-heading">Use cases:</h4>



<ul class="wp-block-list">
<li><strong>Access control and content filtering: </strong>forward proxy kiểm tra các request có hợp lệ hay không để thực hiện forward hoặc block request.</li>



<li><strong>Log/Monitor request</strong>: quản lý và giám sát các request, thường được sử dụng trong môi trường công ty, trường học hay các tổ chức để kiểm soát việc truy cập Internet và bảo vệ khỏi các nội dung độc hại.</li>



<li><strong>User</strong> <strong>Privacy</strong>: forward proxy nằm giữa client và Internet, nó thay mặt client gửi request đến server qua Internet, có thể che dấu danh tính, địa chỉ IP và bảo vệ quyền riêng tư của người dùng thực.</li>



<li><strong>Cache responses</strong>: giảm độ trễ, tăng performance, tối ưu bandwidth, proxy cache lại response để trả về cho client trong các lần request tiếp theo thay vì request trực tiếp đến server.</li>
</ul>



<h4 id="services" class="wp-block-heading">Services:</h4>



<ul class="wp-block-list">
<li>Squid</li>



<li>Privoxy</li>



<li>VPN services</li>



<li>Cloudflare WARP</li>
</ul>



<p></p>



<h2 id="reverse-proxy" class="wp-block-heading">Reverse proxy</h2>



<ul class="wp-block-list">
<li>Là một <em>server proxy,</em> <strong>nằm giữa Internet và server</strong> để xử lý các request thay mặt cho server.</li>



<li>Chúng hoạt động như những servers bình thường. <strong>Reverse proxy</strong> chuyển tiếp request đến một hoặc nhiều server thật, kết quả sau đó trả về cho client, làm cho client không biết về những server thật nói trên.</li>



<li><strong>Reverse proxy</strong> được cài đặt trong một private network của một hoặc nhiều server, và tất cả lưu lượng truy cập đều phải đi qua proxy này.</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="512" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-1024x512.png" alt="" class="wp-image-2440" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-1024x512.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-300x150.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-768x384.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-1536x768.png 1536w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-2048x1024.png 2048w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-380x190.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-800x400.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/reverse_proxy_flow-1160x580.png 1160w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h4 id="use-cases-2" class="wp-block-heading">Use cases:</h4>



<ul class="wp-block-list">
<li><strong>Load Balancing:</strong> cân bằng tải, phân bổ lượng truy cập trang web đến các máy chủ khác nhau, nhằm mục đích tăng throughput, giảm letancy, phục vụ số lượng client lớn hơn.</li>



<li><strong>Security</strong>: có thể coi <strong>reverse proxy</strong> là một Web Application Firewall (WAF), có nhiệm vụ chặn các truy cập khả nghi đến server, làm rate limit, một phần nào đó ngăn chặn tấn công DDoS.</li>



<li><strong>Cache responses</strong>: giảm độ trễ, tăng performance, tối ưu bandwidth, proxy cache lại response để trả về cho client trong các lần request tiếp theo thay vì request trực tiếp đến server.</li>



<li><strong>SSL encryption/decryption</strong>: <strong>reverse proxy</strong> có thể xử lý việc SSL termination (dừng), giải mã lưu lượng được mã hóa SSL từ client và chuyển tiếp nó đến máy chủ phụ trợ ở dạng không được mã hóa và ngược lại.</li>
</ul>



<h4 id="services-2" class="wp-block-heading">Services:</h4>



<ul class="wp-block-list">
<li>Nginx</li>



<li>Apache HTTP</li>



<li>HAProxy</li>



<li>CDN services</li>
</ul>



<p></p>



<h2 id="diem-khac-biet-chinh" class="wp-block-heading"><strong>Điểm khác biệt chính</strong></h2>



<ul class="wp-block-list">
<li>Forward proxy: 
<ul class="wp-block-list">
<li>Xử lý request từ client tới Internet.</li>



<li>Bảo vệ quyền riêng tư client và lọc nội dung.</li>
</ul>
</li>



<li>Reverse proxy:
<ul class="wp-block-list">
<li>Xử lý request từ Internet tới web servers.</li>



<li>Performance và security.</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="963" height="1024" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536-963x1024.jpg" alt="" class="wp-image-2445" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536-963x1024.jpg 963w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536-282x300.jpg 282w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536-768x816.jpg 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536-380x404.jpg 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536-800x850.jpg 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536-1160x1233.jpg 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/257642d6-9742-432b-9ca8-2a866dea04dd_1445x1536.jpg 1445w" sizes="auto, (max-width: 963px) 100vw, 963px" /></figure>



<p class="has-small-font-size"><em>Nguồn: <a href="https://blog.bytebytego.com">https://blog.bytebytego.com</a></em></p>



<p>Cảm ơn mọi người đã dành thời gian để đọc 🙇‍♂️</p>
<p>The post <a href="https://blog.tomosia.com.vn/forward-proxy-vs-reverse-proxy/">Forward proxy vs. Reverse proxy</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/forward-proxy-vs-reverse-proxy/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Top 10 API Security Vulnerabilities in 2023 (Part II)</title>
		<link>https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-ii/</link>
					<comments>https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-ii/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Sun, 08 Oct 2023 04:15:22 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=661</guid>

					<description><![CDATA[<p>Hí anh em! Tôi saiury92 đây ! Sau Part I, anh em thấy như thế nào? Có thấy&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-ii/">Top 10 API Security Vulnerabilities in 2023 (Part II)</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Hí anh em! Tôi <a rel="noreferrer noopener" href="https://saiury92.github.io" data-type="link" data-id="https://saiury92.github.io" target="_blank">saiury92 </a>đây ! Sau <a href="http://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-i/" data-type="link" data-id="http://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-i/">Part I</a>, anh em thấy như thế nào? Có thấy nhột trong lòng sau khi nghĩ về những dự án trước đây đã release cho khách hàng mà vẫn tồn đọng các lỗ hổng bảo  mật không ? Trong bài viết ngày hôm nay anh em còn thấy nhột hơn nữa vì 3 lỗ hổng tiếp theo đây, anh em hay mắc phải và thường tặc lưỡi bỏ qua khi code. </p>



<h4 id="4-unlimited-resource-consumption" class="wp-block-heading"><strong>4. <strong>Unlimited Resource Consumption</strong></strong></h4>



<p>API không được bảo vệ, dễ bị tổn thương trước số lượng request hoặc payload sizes quá lớn. Những kẻ tấn công có thể sử dụng điều này gây Denial of Service (DoS) cho hệ thống, hoặc brute force attacks để cố gắng authentication.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="410" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-38-1024x410.png" alt="" class="wp-image-717" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-38-1024x410.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-38-300x120.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-38-768x307.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-38-380x152.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-38-800x320.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-38.png 1079w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Lỗ hổng <strong>Unlimited Resource Consumption</strong> xảy ra khi API không có cơ chế hạn chế số lượng request tới server. Ví dụ chắc năng login bằng số điện thoại và mã OTP được gửi về số điện thoại, sau đó quá trình xác thực được thực hiện thông qua API <mark style="background-color:#e9ecef" class="has-inline-color">POST /api/users/otp_verify</mark>. Kẻ tấn công sẽ dùng brute force attacks để tấn công API, random OTP từ 0000 -&gt; 9999 để kiểm thử  tìm ra OTP chính xác. Ngoài ra kẻ tấn công có thể upload file với kích thước quá lớn hoặc queries phức tạp khiến API gặp phải tình trạng tắc nghẽn và drop requests.</p>



<p>Cách phòng chống:</p>



<ul class="wp-block-list">
<li>Áp dụng chính sách rate-limiting cho tất cả API endpoints. Đặt biệt với những endpoints liên quan đến authentication là mục tiêu hàng đầu của những kẻ tấn công.</li>



<li>Giới hạn số lượng requests có thể được thực hiện từ một địa chỉ IP hoặc người dùng trong một khoảng thời gian nhất định.</li>



<li>Sử dụng keys, fingerprints, recaptcha, .. để giới hạn tốc độ requests.</li>



<li>Giới hạn payload size và độ phức tạp của query.</li>



<li>Giới hạn số lượng dữ liệu mà một truy vấn có thể truy xuất bằng cách áp dụng các giới hạn về pagination size, or page counts.</li>



<li>Tận dụng các biện pháp bảo vệ DDoS từ cloud provider (AWS WAF, API Gateway, &#8230;).</li>
</ul>



<h4 id="5-broken-function-level-authorization" class="wp-block-heading"><strong>5. Broken function level authorization</strong></h4>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="700" height="394" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-39.png" alt="" class="wp-image-745" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-39.png 700w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-39-300x169.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-39-380x214.png 380w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>



<p>Ở Part I, chúng ta có <strong>broken object level authorization</strong> là lỗ hổng liên quan đến phân quyền truy cập đến các đối tượng, user1 có thể truy xuất dữ liệu của user2 thông qua thay đổi ID. Còn lỗ hổng <strong>broken function level authorization</strong> liên quan đến phân quyền các chức năng của hệ thống. Kẻ tấn công phán đoán các API ẩn với những đặc quyền cao hơn và thực thi chúng. Ví dụ kẻ tấn công có thể truy cập đến API <mark style="background-color:#e9ecef" class="has-inline-color">/api/users/my_financial_info</mark>, bọn chúng phán đoán và thử thay đổi <mark style="background-color:#e9ecef" class="has-inline-color">users -&gt; admin</mark> truy cập vào API <mark style="background-color:#e9ecef" class="has-inline-color">/api/admin/all_info</mark>, sự phân quyền yếu kém có thể dẫn đến việc lộ hết các thông tin nhạy cảm của tất cả users.</p>



<p>Cách phòng chống:</p>



<ul class="wp-block-list">
<li>Chia các API endpoints thành các function scope, phần quyền chặt chẽ theo từng scope.</li>



<li>Kiểm soát truy cập các function trên server không bao giờ chỉ xử lý phân quyền ở phía client.</li>



<li>Mặc định để <em><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">deny all</mark></em> access các function. Chỉ cấp quyền với đối tượng cụ thể.</li>
</ul>



<h4 id="6-unrestricted-access-to-sensitive-business-flows" class="wp-block-heading"><strong>6. Unrestricted Access to Sensitive Business Flows</strong></h4>



<p>Khi các API thực hiện một business flow (quy trình đặt vé, mua sản phẩm, ..). Kẻ tấn công nắm được các business này, lợi dụng các API bằng các phương pháp tự động để đạt được mục đích xấu, chẳng hạn như lấy cắp dữ liệu hoặc thao túng dữ liệu thị trường hoặc giá cả.</p>



<p>Một business flow thường gặp và kịch bản tấn công:</p>



<ul class="wp-block-list">
<li>Purchasing a product flow &#8211; Kẻ tấn công sử dụng tính năng tự động để mua tất cả hàng tồn kho của một mặt hàng có nhu cầu cao cùng một lúc và bán lại với giá cao hơn.</li>



<li>Creating a comment/post flow &#8211; Kẻ tấn công lợi dụng tính năng bình luận hoặc post bài viết để tự động spam hệ thống.</li>



<li>Making a reservation &#8211; Kẻ tấn công có thể đặt tất cả các chỗ , ngăn chặn người dùng khác sử dụng hệ thống. </li>
</ul>



<p>Cách phòng chống:</p>



<ul class="wp-block-list">
<li>Cần nắm vững các business flow, hiểu các business flow có thể dễ bị lạm dụng và thêm các lớp bảo vệ bổ sung cho các quy trình này, authentication là required.</li>



<li>Áp dụng rate-limiting để hạn chế số lượng và tốc độ truy cập.</li>



<li>Monitor số lượng truy cập API để phát hiện nguồn truy cập đáng ngờ.</li>



<li>Identify non-human: Xác định xem đó có phải người dùng thao tác không chẳng hạn như kiểm tra giao dịch nhanh bất thường, thiết lập Captcha, human detection,..</li>
</ul>



<p>Trong ba lỗ hổng trên, ý kiến cá nhân mình đánh giá <strong>Unrestricted Access to Sensitive Business Flows</strong> là anh em xác suất dính phải cao nhất, còn các anh em khác thấy như thế nào? Tự hỏi admin blog mình có cơ chế nào tránh việc comment spam không ta ?&#8230;&#8230;.</p>



<p><strong>Reference</strong></p>



<p><a href="https://apisecurity.io/owasp-api-security-top-10/">https://apisecurity.io/owasp-api-security-top-10/</a></p>
<p>The post <a href="https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-ii/">Top 10 API Security Vulnerabilities in 2023 (Part II)</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-ii/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Top 10 API Security Vulnerabilities in 2023 (Part I)</title>
		<link>https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-i/</link>
					<comments>https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-i/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Sun, 08 Oct 2023 03:53:21 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=480</guid>

					<description><![CDATA[<p>Hí anh em! Tôi saiury92 đây ! Phận làm dev mười hai bến nước , trong nhờ đục&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-i/">Top 10 API Security Vulnerabilities in 2023 (Part I)</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Hí anh em! Tôi <a rel="noreferrer noopener" href="https://saiury92.github.io" data-type="link" data-id="https://saiury92.github.io" target="_blank">saiury92 </a>đây ! Phận làm dev mười hai bến nước , trong nhờ đục chịu. Code thì phải làm bảo deadline, đúng estimate, nhưng lại phải không có bug, sếp thì lúc nào cũng dí ! Qua ông sếp mới sang vỗ vai bảo &#8220;<em>chú code tốt, bug thì cũng ít đấy nhưng security của dự án thì thế nào em ?</em>&#8221; Hả security là cái quái gì ? Mình code đúng theo yêu cầu spec của khách hàng là được rồi mà ! Thế là tôi lại phải đi hỏi ChatGPT, Bard,&#8230; thì mới ớ người ra, vấn đề bảo mật nó còn quan trọng hơn bất kỳ cái gì khác ! Dự án có code ngon đến đâu dính vào lỗ hổng bảo mật là bọn hacker nó vào phá nát như tương !<br><br>Chính thế !! Hôm nay tôi đưa đến cho các đồng dâm <strong>10 vấn đề của API security thường gặp</strong> để anh em có thể vỗ ngực trước sếp &#8220;security à ! Cái này em được học từ trong bụng mẹ !&#8221;</p>



<h4 id="1-broken-object-level-authorization" class="wp-block-heading"><strong>1. Broken object level authorization</strong></h4>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="700" height="394" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-35.png" alt="" class="wp-image-665" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-35.png 700w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-35-300x169.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-35-380x214.png 380w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>



<p>Sở dĩ <strong>Broken object level authorization</strong> nằm top 1 là vì hacker không cần sử dụng phương pháp tấn công gì cao siêu, chỉ cần thay thế ID tài nguyên của họ bằng ID tài nguyên thuộc về người dùng khác. Ví dụ như, kẻ tấn công biết được API có dạng <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">/api/shopID/financial_info</mark>, chúng thử nghiệm thay thế từng <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">shopID</mark>, nếu API không phân quyền user với từng shop thì hacker có thể xem được thông tin của tất cả các shop. Vấn đề có thể trầm trọng hơn khi ID là tuyến tính có thể liệt kê ra được (ID: 1,2,3,..).</p>



<p>Cách phòng chống:</p>



<ul class="wp-block-list">
<li>Thực hiện kiểm tra ủy quyền chặt chẽ với từng API và nên xây dựng hệ thống phân quyền có cấp bậc với từng tài nguyên. Chỉ những user có quyền xem <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">financial_info</mark> của <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">shop1ID</mark> mới có quyền call API <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">/api/shop1ID/financial_info</mark>.</li>



<li>Không nên dựa vào ID phía client gửi, sử dụng ID được lưu trữ trong session.  Thay vì sử dụng <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">/api/shopID/financial_info</mark>, ta có thể sử dụng <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">/api/financial_info</mark> lấy thông tin shop dựa vào <strong>current_user</strong>.</li>



<li>Sử dụng random IDs để kẻ tấn công không thể đoán được (UUIDs &#8211; <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">/api/cc20c3ec-1fcc-4912-a0bc-b361d1180b63/financial_info</mark>).</li>



<li>Triển khai test case đầy đủ để ngăn ngừa lỗ hổng này.</li>
</ul>



<h4 id="2-broken-authentication" class="wp-block-heading"><strong>2. Broken authentication</strong></h4>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="700" height="394" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-36.png" alt="" class="wp-image-667" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-36.png 700w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-36-300x169.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-36-380x214.png 380w" sizes="auto, (max-width: 700px) 100vw, 700px" /></figure>



<p>Broken object level authorization là lỗ hổng liên quan đến phân quyền, còn<strong> broken authentication </strong>là xác thực. Xác thực API được triển khai kém cho phép hacker giả định danh tính của người dùng khác hoặc truy cập tài nguyên mà không cần bất kỳ xác thực nào.</p>



<p>Nguyên nhân dẫn đến broken authentication:</p>



<ul class="wp-block-list">
<li>Những internal API không có authentication. Một số API nằm trong private network chúng ta mặc định đã an toàn mà bỏ qua việc xác thực.</li>



<li>Có cơ chế xác thực nhưng cơ thể xác thực đơn giản, API key yếu, dễ đoán không rotate định kỳ.</li>



<li>Mật khẩu yếu, plain text, hàm băm kém, mật khẩu dùng chung hoặc mật khẩu mặc định. Một số hệ thống tự động tạo password mặc định nhưng password dễ đoán mà không có chức năng reset password lần login đầu tiên.</li>



<li>Authentication dễ bị brute force attacks. Brute force attacks là kiểu tấn công mà hacker sẽ cố gắng đoán mật khẩu hoặc các thông tin xác thực khác bằng cách thử tất cả các kết hợp ký tự có thể.</li>



<li>Thông tin credentials and keys bị lộ trong URLs.</li>



<li>Cơ chế xác thực yếu, JWT token&nbsp;chỉ decode mà không verify signature (chữ ký).</li>



<li>Sử dụng token vĩnh viễn, không hết hạn.</li>
</ul>



<p>Cách phòng chống:</p>



<ul class="wp-block-list">
<li>Kiểm tra tất cả các API đã xác thực chưa, nếu có thì các cách có thể xác thực.</li>



<li>API cho password reset and one-time links để authenticate cần được bảo mật, có thể đính kèm với one-time verification code.</li>



<li>Sử dụng những phương pháp tiêu chuẩn có sẵn để generate token (JWT), lưu trữ password và multi-factor authentication (MFA).</li>



<li>Sử dụng rate-limiting cho việc authentication (quy định hạn mức request authenticate thất bại), thực hiện các chính sách lockout khi có nghi ngờ, kiểm tra password yếu của người dùng.</li>
</ul>



<h4 id="3-broken-object-property-level-authorization" class="wp-block-heading"><strong>3. <strong>Broken Object Property Level Authorization</strong></strong></h4>



<p>API endpoints có thể bị tấn công dựa vào data của chúng (request data, response data): response data tiết lộ nhiều thông tin hơn mục đích business (excessive information exposure), chấp nhận và xử lý nhiều request data hơn mức cần thiết (mass assignment).</p>



<p>Nhiều API trả về toàn bộ dữ liệu thuộc tính của object (<code><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">user-&gt;toJson()</mark></code>), việc lọc dữ liệu cần thiết để hiển thị được hiện bên phía client. Kể tấn công có thể lấy các dữ liệu nhạy cảm, phân tích để biết được các fields của object của database để tấn công mass assignment.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="767" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34-1024x767.png" alt="" class="wp-image-623" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34-1024x767.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34-300x225.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34-768x575.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34-380x285.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34-800x599.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34-1160x869.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2023/10/image-34.png 1400w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>Mass assignment</strong> ở đây là cách kẻ tấn công bổ sung thêm các fields nhạy cảm vào request payload gửi lên API. API không lọc dữ liệu đầu vào, permit data, bind toàn bộ params data sang object và lưu object đó vào database. Kẻ tấn công có thể chỉnh sửa thông tin nhạy cảm, thay đổi role người dùng,&#8230;</p>



<p>Cách phòng chống:</p>



<ul class="wp-block-list">
<li>Không trả về toàn bộ dữ liệu và dữ liệu phải được lọc ở server trước khi trả về cho client. Chỉ tiết lộ dữ liệu cần thiết để hiển thị phía client.</li>



<li>Xác định các dữ liệu nhạy cảm và tránh tiết lộ các thông tin này: Personally Identifiable Information (PII &#8211; email, phone, passport, Social Security number), Payment Card Industry (PCI).</li>



<li>Không tự động assign params data tới objects. Cần permit params, payload data, lọc và lấy dữ liệu cần thiết.</li>



<li>Sử dụng readOnly với những thuộc tính có thể truy xuất qua API mà không bao giờ được sửa đổi.</li>
</ul>



<p>Trên đây là top 3 lỗ hổng bảo mật hàng đầu ! Thui buồn ngủ rùi hẹn các đồng dâm ở <a href="http://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-ii/" data-type="link" data-id="http://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-ii/">part II</a> nha !</p>



<p><strong>Reference</strong></p>



<p><a href="https://apisecurity.io/owasp-api-security-top-10/">https://apisecurity.io/owasp-api-security-top-10/</a></p>
<p>The post <a href="https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-i/">Top 10 API Security Vulnerabilities in 2023 (Part I)</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/top-10-api-security-vulnerabilities-in-2023-part-i/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
		<item>
		<title>SQL Injection</title>
		<link>https://blog.tomosia.com.vn/sql-injection/</link>
					<comments>https://blog.tomosia.com.vn/sql-injection/#comments</comments>
		
		<dc:creator><![CDATA[Việt Nguyễn]]></dc:creator>
		<pubDate>Wed, 27 Sep 2023 17:06:20 +0000</pubDate>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Injection]]></category>
		<category><![CDATA[Sql]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=103</guid>

					<description><![CDATA[<p>SQL Injection&#160;là một kỹ thuật lợi dụng những lỗ hổng về câu truy vấn của các ứng dụng.&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/sql-injection/">SQL Injection</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>SQL Injection</strong>&nbsp;là một kỹ thuật lợi dụng những lỗ hổng về câu truy vấn của các ứng dụng. Được thực hiện bằng cách chèn thêm một đoạn&nbsp;<a href="https://topdev.vn/blog/sql-la-gi/">SQL</a>&nbsp;để làm sai lệnh đi câu truy vấn ban đầu, từ đó có thể khai thác dữ liệu từ database.&nbsp;<strong>SQL injection</strong>&nbsp;có thể cho phép những kẻ tấn công thực hiện các thao tác như một người quản trị web,&nbsp;trên cơ sở dữ liệu của ứng dụng</p>
<p>The post <a href="https://blog.tomosia.com.vn/sql-injection/">SQL Injection</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/sql-injection/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<series:name><![CDATA[Web vulnerability]]></series:name>
	</item>
	</channel>
</rss>
