(1)什麼是表單javascript
表單在網頁中主要負責數據採集功能。一個表單有三個基本組成部分: 表單標籤:這裏麪包含了處理表單數據所用CGI程序的URL以及數據提交到服務器的方法。 表單域:包含了文本框、密碼框、隱藏域、多行文本框、複選框、單選框、下拉選擇框和文件上傳框等。 表單按鈕:包括提交按鈕、復位按鈕和通常按鈕;用於將數據傳送到服務器上的CGI腳本或者取消輸入,還能夠用表單按鈕來控制其餘定義了處理腳本的處理工做。php
(2)瀏覽器能夠解析運行什麼語言html
HTML、XML等標記語言,還有Javascript、PHP等腳本語言等等前端
(3)WebServer支持哪些動態語言java
Javascript、PHP、servlet、ASP等等mysql
之前SQL注入以及XSS都據說過不少次了,此次實驗總算切實地體驗了一次什麼是SQL注入,以及XSS。讓咱們知道了防範SQL注入和XSS的重要性,我瞭解到如何防範SQL注入和XSS。對SQL注入,用戶輸入的數據必定要通過處理再執行數據庫的相關操做,這須要不少經驗。對XSS,一樣要處理用戶輸入的數據,在PHP中,POST方式傳來的數據須要用trim();stripslashes();htmlspecialchars();
處理之類的。
雖然實驗期間趕上了不少麻煩,比以前的實驗花了更多時間,可是感受比想象中稍微容易一點,多是由於以前選修過《數據庫原理與安全》和《網絡安全編程基礎》吧,並且課題負責人的博客也是巨大的助力。
應爲以前學過《數據庫原理與安全》和《網絡安全編程基礎》,HTML和MySQL我都有點基礎感受作起來不難。PHP之前徹底沒接觸過,犯了不少很基礎的錯誤,就是在這裏花了不少時間學語法。web
先啓動apache服務(一開始忘了改hostname)
sql
發現80端口已經被佔用,那就修改配置文件,改爲5120端口好了,再次啓動apache,用瀏覽器打開127.0.0.1:5120
能夠看到上次實踐寫的頁面,說明apache正常工做中
數據庫
在/var/www/html/
目錄下新建文件5120.html,用vim編寫一個簡單的帶表單頁面,以後能夠用瀏覽器訪問127.0.0.1(或localhost):5120/文件名
訪問該文件,期間我發現用vim寫這個真是不順手,修改起來很麻煩,我應該先在eclipse寫好粘過去
apache
用Javascript寫一個檢查用戶名是否爲空的函數,點擊提交按鈕時執行,此次我機智地先用eclipse寫好測試無誤後粘貼到虛擬機
惋惜粘完發現中文亂碼了
改一下,加上一句用utf-8編碼
測試成功
如下最終版5120.html:
<html> <head> <meta charset="utf-8"> <title>5120_Login</title> <script type="text/javascript"> function checkUname(){ var uname=document.getElementById("uname"); if(uname.value==""){ alert("用戶名不能爲空!"); } } </script> </head> <body> <h1>輸用戶名密碼:</h1> <form name="myform" action="5120.php" method="post"> <table> <tr> <td align="right">用戶名:</td> <td><input type="text" name="uname" id="uname"/></td> </tr> <tr> <td align="right">密碼:</td> <td><input type="password" name="pw" id="pw"/></td> </tr> </table> <input type="submit" value="登陸" onclick="checkUname()"/> </form> </body> </html>
/etc/init.d/mysql start
啓動Mysql服務
mysql -u root -p
登陸,默認密碼p@ssw0rd
太複雜了,固然是選擇update它
use mysql; UPDATE user SET password=PASSWORD("123456(新密碼)") WHERE user='root'; flush privileges;
退出重進,密碼已改
而後,新建數據庫,新建數據表,插入數據,最後查詢一下試試
create schema `hxx5120`; #新建數據庫 create table `hxx5120`.`users` ( #新建數據表 `uid` int not null comment '', `uname` varchar(20) comment '', `pw` varchar(256) comment '', #開始的時候把長度設過小告終果後面用條件查詢where pw=***出問題,查不出來 primary key (`uid`) comment ''); insert into users values(1,'aaa',password("5120")); #插入數據 select * from users; #查詢 select * from users where uname='aaa' and pw=password('5120');
新知識,老套路,先寫個helloworld試試,簡單
再試試獲得表單傳過來的元素,Pass
PHP鏈接數據庫,沒什麼問題,而後數據查詢,我頗有自知之明的選擇先輸出要執行的sql語句,一嘗試果真就有失了智似得錯,默默地把格式改回'{$***}'
而後又發現下面調用用戶名的時候打錯成了uanme,最後成功
如下最終版5120.php:
<html> <head> <title>5120_php</title> </head> <body> <?php $uname = $_POST["uname"]; $pw = $_POST["pw"]; $servername = "localhost"; $username = "root"; $password = "123456"; $dbname = "hxx5120"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("鏈接失敗: " . $conn->connect_error); } $sql = "SELECT * FROM users WHERE uname='{$uname}' AND pw=PASSWORD('{$pw}');"; //echo $sql; $result = $conn->query($sql); if ($result->num_rows > 0) { echo "登陸成功\n歡迎你 $uname!"; } else { echo "用戶名或密碼錯誤"; } $conn->close(); ?> </body> </html>
嘗試了永真式注入,在用戶名處輸入' or 1=1#
,sql語句就變成了SELECT * FROM users WHERE uname='' or 1=1# AND pw=PASSWORD('{$pw}');
密碼隨便輸,由於後面都被註釋掉了,而1=1是永遠成立的,老是能登陸上去。
遺憾,早知道前面就不用POST方法了,由於POST方法不經過url傳表單數據,能力有限,沒辦法只能從新作頁面,分別copy一下5120.html,5120.php爲x5120.html,x5120.php
不上代碼了,和以前基本同樣就是改爲GET方法,方便我進行XSS攻擊,
找了張圖片power.jpg放到/var/www/html/
目錄下
以後在x5120.html輸入用戶名處輸入<img src="power.jpg" />大家對力量一無所知</a>
,結果以下