終於來到Web應用安全這一領域了。基礎爲王,要想入門Web安全領域,對基本的Web開發的基礎知識必定要了解。javascript
Web開發通常來講是分前端、後端的。固然如今很火的一個概念——全棧工程師,能夠認爲是對先後端都有涉獵的全才。php
環境的搭建不是重點,這裏就輕描淡寫地說一下。有問題能夠利用搜索引擎查找解決方案。css
此次實驗我用的是ubuntu 18.04,在這上面安裝Apache很是簡單。html
sudo apt-get install apache2
安裝apache2後,輸入下面的命令打開apache服務前端
/etc/init.d/apache2 start
而後在瀏覽器裏輸入localhost
查看測試頁面java
關閉apache服務用/etc/init.d/apache2 stop
便可node
mysql的安裝也很是簡單sudo apt-get install mysql-server
python
而後開啓服務/etc/init.d/mysql start
mysql
接着進入mysql,輸入sudo mysql -u root -p
默認password依然是rootweb
而後咱們創建一個新的數據庫web_db,輸入create database web_db
在web_db數據庫中,創建一個名爲users的表
use web_db; create table users( username varchar(256), password varchar(20) );
而後咱們向users表中插入一條數據
insert into users values('wangyifan', '20155110');
至此,咱們的準備工做已經作好了。
因爲權限問題,咱們還有另外一個用戶帳號能夠登陸mysql。
查看/etc/mysql/debian.cnf中的內容
用戶名debian-sys-maint,口令SY7hZpYpuHu5YJY4也能夠訪問數據庫。
關於SQL語句和關係型數據庫的話題,須要之後慢慢了解。
咱們直接上PHP的官網php.net找解決方案吧。
這裏我就不重複搬運了。別忘了php的mysql模塊的安裝
在/var/www/html
下建立一個測試用的test.php
<?php phpinfo() ?>
在瀏覽器中訪問這個PHP文件,咱們就能夠查看PHP的配置狀況
至此,咱們完成了PHP的配置。
Web開發方面的知識上手很快,可是隨着技術的不斷進步,源源不斷的新框架、新技術、新思想、新實踐的出現,更讓人眼花繚亂。
即使是Web前端也發生了翻天覆地的變化,早年掌握html,css,JavaScript熟悉dreamweaver就能吃遍天。
而如今,前端的工程化實踐愈來愈凸顯,各大框架層出不窮……
node.js的出現使得一大批JavaScript前端工程師又標榜本身是「全棧工程師」……
固然了,咱們暫時不須要了解最新的技術,但必定要掌握一些基礎。
通俗的來講,HTML文檔就是網頁,它由衆多的標籤組成,標籤內還有各類屬性。
咱們應該瞭解
這裏着重介紹一下DOM這個東西。HTML文檔從某種程度上說,就是一棵DOM樹。
沒錯,DOM是一個樹型結構,就像下圖這樣。
每一個節點都是一個對象,擁有方法和屬性。
JavaScript能夠訪問和更新這個DOM樹(而不是HTML源代碼)
針對DOM樹的任何修改都會反映到瀏覽器中。
HTML中有一個臭名昭著的標籤就是iframe,早期的網頁掛馬用的就是iframe標籤。
JavaScript是被《Web前端黑客技術揭祕》的做者稱爲「跨站之魂」的強大語言。
JavaScript幾乎能夠控制前端的一切操做,還能獲取隱私信息。有了XSS漏洞,經過注入JavaScript攻擊者就能夠進行一系列操做。
對於JavaScript,咱們至少應該知道:
限於篇幅,咱們這裏只介紹 同源策略,它是瀏覽器最核心也最基本的安全功能。
Web是構建在同源策略基礎之上的,AJAX就是嚴格遵照同源策略的,cookie的共享也嚴格限制在同一父域中。
咱們着重討論什麼是同域。同域就是兩個站點用同協議、同域名、同端口。
咱們給出一個例子,判斷下面的站點是否與http://www.example.com同域。
站點 | 是否同域 | 緣由 |
---|---|---|
https://www.example.com | 不一樣域 | 協議不一樣(http與https) |
http://test.example.com | 不一樣域 | 域名不一樣(子域名test和www) |
http://example.com | 不一樣域 | 域名不一樣(頂級域和www子域) |
http://www.example.com:8080 | 不一樣域 | 端口不一樣(8080端口和80端口) |
http://www.example.com/a/ | 同域 | 同協議,同域名,同端口,只是多了個目錄 |
一般所說的兩個站點同域,就是指它們同源。
AJAX是很是經常使用的技術,可讓數據在後臺進行異步傳輸,好比對網頁局部數據的更新,不用刷新整個網頁。AJAX同時也是黑客「殺人無形」的利器。咱們有時間應該熟悉一下這個技術。
CSS是層疊樣式表,用來控制網頁的呈現樣式,好比顏色、字體、大小、高寬、佈局等等。
做爲網絡對抗這門課來講,經過CSS的靈活應用作假裝來釣魚是個不錯的選擇。
不過讓一個黑客搞美工?這……有點不太現實。
接下來,咱們本身簡單地寫一個網站,只完成最基本的登陸功能便可。
咱們以前建立了web_db這個數據庫,在web_db中添加了users表,並插入了一條數據。
登陸的用戶名爲wangyifan,口令爲20155110。
首先咱們編寫前端的登陸頁面,很是簡單。
咱們編寫一個名叫login.html的登陸表單
<html> <head> <title>Welcome</title> </head> <body> <h1>Welcome!</h1> <form method="POST" action="login.php"> <label> Name: <input type="text" id="username" name="username" /> </label> <br /> <label> Password: <input type="password" id="password" name="password" /> </label> <br /> <div id="feedback"></div> <br /> <input type="submit" value="login" /> </form> <script src="event.js"></script> </body> </html>
核心部分就是form表單,input標籤的name屬性是後臺php接收參數時要用到的。
<input type="password">
是密碼框,儘管在屏幕上被隱藏了口令,但不表明傳輸過程當中是安全的。
咱們特意留下了id屬性,和div標籤,這是爲了後面的JavaScript用getElementById操做DOM元素和處理事件用的。
咱們編寫event.js處理事件。當焦點離開用戶名輸入框時,若是用戶輸入的字符少於5個,咱們在頁面反饋信息,提示用戶名不該該少於5個字符。
function checkUsername() { var elMsg = document.getElementById('feedback'); if (this.value.length < 5) { elMsg.textContent = 'Username must be 5 characters or more'; } else { elMsg.textContent = ''; } } var elUsername = document.getElementById('username'); elUsername.onblur = checkUsername;
JavaScript處理事件的方法有三種:HTML事件處理屬性、DOM事件處理、事件監聽器。
咱們這裏用到的是第二種——DOM事件處理。(我到一個大牛朋友嘲笑我不會JQuery……其實我對JavaScript也一竅不通)
詳細的一些JavaScript處理DOM的技巧,能夠看一下《JavaScript DOM編程藝術》
咱們用PHP處理前端提交的表單。依葫蘆畫瓢,照搬學長的代碼。
下面是login.php
<?php $username=$_POST["username"]; $password=$_POST["password"]; $query_str="SELECT * FROM users where username='$username' and password='$password';"; $mysqli = new mysqli("127.0.0.1", "debian-sys-maint", "SY7hZpYpuHu5YJY4", "web_db"); if ($mysqli->connect_errno) { printf("Connect failed: %s\n", $mysqli->connect_error); exit(); } if ($result = $mysqli->query($query_str)) { if ($result->num_rows > 0 ){ echo "<br><h3>Hello, $username</h3> <br> "; } else { echo "<br><h3> login failed!!!! </h3><br> " ; } $result->close(); } $mysqli->close(); ?>
雖然我對PHP一竅不通,可是這段代碼的邏輯很容易從字面上理解的。
和Java的JDBC相比,php鏈接數據庫仍是挺方便的。
這裏故意用字符串拼接的方式構成$query_str查詢語句,方便後面的SQL注入。
若是用參數化語句的話,就能大大提升對SQL注入的免疫力。
別笑,雖然這個網站挺簡陋的,但能把原理了解清楚就行。
首先,看一下JavaScript事件處理的效果
而後,咱們輸入正確的用戶名,口令
登陸成功了。
輸入一個錯誤的用戶名或者口令,提示登陸失敗。
接着,咱們就先體驗一下SQL注入和XSS吧。
形成這些漏洞的最本質的緣由——數據和指令的混淆。
被污染的數據流被注入到指令的執行之中,就會產生上面兩個漏洞。
前者是數據變成SQL語句的一部,後者是數據變爲可執行的JavaScript腳本。
此次實驗先不給出XSS和SQL注入的詳細介紹,只是先體驗一下。
咱們知道以前的SQL語句是有字符串拼接而成的select * from users where username= '$username' and password='$password';
咱們能夠用'
這個符合閉合以前的單引號,而後註釋掉後面的SQL語句。
輸入'or 1=1 #
,獲得select * from users where username = '' or 1=1 # and password=''
因此結果集必定不爲空,能夠繞過登陸認證。
這就是最簡單的一個SQL注入。
XSS本質是腳本的執行,固然不必定是JavaScript,也能夠是一段html片斷。
咱們如今就讓網站執行一次彈窗。固然,真正的XSS攻擊不會這麼簡單。
輸入'or 1=1 # <script>alert("xss")</script>
接着點擊登陸按鈕,咱們的JavaScript代碼就會執行。
固然,做爲注入的內容,也能夠是HTML片斷。
好比<img src="test.png">
,展現圖片
(1) 什麼是表單?
答:表單在網頁中提供數據採集功能,咱們看到的一些文本框、密碼框、單選框、提交按鈕都是表單的一部分。
(2) 瀏覽器能夠解析運行什麼語言?
答:主要就是HTML,CSS和JavaScript,其餘的客戶端腳本也能夠執行。
(3) WebServer支持哪些動態語言?
答:早期Web編程都是靠CGI,你會看到用C/C++、Perl、bash進行服務器端Web編程的。
後來就有了Servlet/JSP、PHP、ASP等等,如今出現一些新秀,好比python,Go語言,ruby on rails等等,均可以進行web編程。
基礎爲王,實話實說,我目前在Web方面的基礎知識並不全面,有不少東西還不熟悉。
若是時間和篇幅容許,讓我多學一點東西,我乾脆寫一系列的Web基礎學習筆記。
雖然說Web的東西上手快,可是內容有些龐雜,很差組織。我這篇報告也寫的七零八落的。
之後的學習中缺什麼補什麼就行。
我以爲未來工做之後,業餘時間看看Web前端也不錯的,有個瀏覽器就夠了。