一、SQL注入
javascript
SQL注入是一種惡意攻擊,用戶利用在表單字段輸入SQL語句的方式來影響正常的SQL執行。還有一種是經過system()或exec()命令注入的,它具備相同的SQL注入機制,但只針對shell命令。
php
- $username = $_POST['username'];
- $query = "select * from auth where username = '".$username."'";
- echo $query;
- $db = new mysqli('localhost', 'demo', ‘demo', ‘demodemo');
- $result = $db->query($query);
- if ($result && $result->num_rows) {
- echo "<br />Logged in successfully";
- } else {
- echo "<br />Login failed";
- }
防止SQL注入選項:
*使用mysql_real_escape_string()過濾數據
*手動檢查每一數據是否爲正確的數據類型
*使用預處理語句並綁定變量
*使用準備好的預處理語句
*分離數據和SQL邏輯
*預處理語句將自動過濾(如:轉義)
*把它做爲一個編碼規範,能夠幫助團隊裏的新人避免遇到以上問題
- $query = 'select name, district from city where countrycode=?';
- if ($stmt = $db->prepare($query) ){
- $countrycode = 'hk';
- $stmt->bind_param("s", $countrycode);
- $stmt->execute();
- $stmt->bind_result($name, $district);
- while ( $stmt ($stmt->fetch() ){
- echo $name.', '.$district;
- echo '<br />';
- }
- $stmt->close();
- }
二、XSS攻擊
html
XSS(跨站點腳本攻擊)是一種攻擊,由用戶輸入一些數據到你的網站,其中包括客戶端腳本(一般JavaScript)。若是你沒有過濾就輸出數據到另外一個web頁面,這個腳本將被執行。接收用戶提交的文本內容java
將會發生什麼事?
*煩人的彈窗
*刷新或重定向
*損壞網頁或表單
*竊取cookie
*AJAX(XMLHttpRequest)
防止XSS攻擊
爲了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。
htmlentities()的基本用法很簡單,但也有許多高級的控制,請參閱 XSS速查表。python
三、會話固定
mysql
會話安全,假設一個PHPSESSID很難猜想。然而,PHP能夠接受一個會話ID經過一個Cookie或者URL。所以,欺騙一個受害者可使用一個特定的(或其餘的)會話ID 或者釣魚攻擊。web
四、會議捕獲和劫持
sql
這是與會話固定有着一樣的想法,然而,它涉及竊取會話ID。若是會話ID存儲在Cookie中,攻擊者能夠經過XSS和JavaScript竊取。若是會話ID包含在URL上,也能夠經過嗅探或者從代理服務器那得到。
防止會話捕獲和劫持:
*更新ID
*若是使用會話,請確保用戶使用SSLshell
五、跨站點請求僞造(CSRF)
瀏覽器
CSRF攻擊,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但不是故意的。它有許多的變體,好比下面的例子:
- <img src='http://example.com/single_click_to_buy.php?user_id=123&item=12345'>
防止跨站點請求僞造
通常來講,確保用戶來自你的表單,而且匹配每個你發送出去的表單。有兩點必定要記住:
對用戶會話採用適當的安全措施,例如:給每個會話更新id和用戶使用SSL。
生成另外一個一次性的令牌並將其嵌入表單,保存在會話中(一個會話變量),在提交時檢查它。
六、代碼注入
代碼注入是利用計算機漏洞經過處理無效數據形成的。問題出在,當你不當心執行任意代碼,一般經過文件包含。寫得很糟糕的代碼能夠容許一個遠程文件包含並執行。如許多PHP函數,如require能夠包含URL或文件名,例如:
- <form>
- Choose theme:
- <select name = theme>
- <option value = blue>Blue</option>
- <option value = green>Green</option>
- <option value = red>Red</option>
- </select>
- <input type = submit>
- </form>
- <?php
- if($theme) {
- require($theme.'.txt');
- }
- ?>
在上面的例子中,經過傳遞用戶輸入的一個文件名或文件名的一部分,來包含以"http://"開頭的文件。
防止代碼注入
*過濾用戶輸入
*在php.ini中設置禁用allow_url_fopen和allow_url_include。這將禁用require/include/fopen的遠程文件。
其餘的通常原則 1. 不要依賴服務器配置來保護你的應用,特別是當你的web服務器/ PHP是由你的ISP管理,或者當你的網站可能遷移/部署到別處,將來再從別處遷移/部署在到其餘地方。請在網站代碼中嵌入帶有安全意識的檢查/邏輯(HTML、JavaScript、PHP,等等)。 2. 設計服務器端的安全腳本: —例如,使用單行執行 - 單點身份驗證和數據清理 —例如,在全部的安全敏感頁面嵌入一個PHP函數/文件,用來處理全部登陸/安全性邏輯檢查 3. 確保你的代碼更新,並打上最新補丁。