輸入處理與安全性

1.輸入處理php

輸入處理爲業務邏輯處理以前的數據準備階段。正則表達式

a.檢驗字符編碼的有效性編程

b.必要時轉換字符編碼安全

c.檢驗參數字符串的有效性框架

 

檢驗字符編碼:每種語言都有檢驗字符編碼的函數,再輸入處理中使用相應函數進行檢驗。xss

轉換字符編碼:轉換字符編碼的方法因編程語言而不一樣,可分爲自動轉換字符編碼的語言和在腳本中手動轉換字符編碼的語言。編程語言

輸入校驗:今早發現輸入錯誤並提示用戶從新輸入,提升了易用性;防止錯誤處理形成數據不一致等,提升了系統的可靠性。函數

安全性策略和輸入校驗:輸入階段實施的校驗不能成爲安全隱患的防範策略,輸入校驗是根據應用程序的軟件規格而實施的操做。編碼

根據應用程序的規格進行校驗:spa

校驗控制字符,換行符(CR和LF)和Tab等一般不顯示在頁面上、ASCIIb編碼中0x20如下以及0x7F(DELETE)的字符、空字節。

校驗字符數,應用程序的規格文檔中應當明肯定義全部輸入項目的最大字符數。

須要校驗的參數:輸入校驗的對象爲全部的參數。

hidden參數、單選框、select元素;

Cookie中包含會話ID之外的值的狀況下,Cookie值也是校驗對象;

Referer等HTTP消息頭也須要校驗。

 

2.二進制安全與空字節攻擊

二進制安全:無論輸入值是怎樣的字節列都能原封不動地對其進行處理的功能,特別是當包含零值字節(NULL字節,\0)時也能正確處理。

空字節:在C語言以及Unix與Windows的API中規定空字節爲字符串的結尾。不能正確處理空字節的函數被稱爲不是二進制安全的函數。

空字節攻擊:利用空字節攻擊的手段被稱爲空字節攻擊。空字節攻擊自己並不形成傷害,而是一般被用於繞過其餘安全隱患的防範策略。

檢驗腳本以下:

test.php

<body>
<?php
$p = $_GET['p'];
if (ereg('^[0-9]+$', $p) === FALSE) {
die('整數値を入力してください');
}
echo $p;
?>
</body>

檢驗參數p是否只包含數字

http://www.wcs.com/test.php?p=1%00<script>alert('xss')</script>

經過%00截斷繞過了ereg檢驗。ereg函數不是二進制安全的函數。

 

3.PHP的正則表達式庫

利用正則表達式便利地實現輸入校驗。

ereg系列,非二進制安全,在PHP5.3及之後已被廢棄;

preg系列,僅在字符編碼爲UTF-8的狀況下能正常處理中文字符;

mb_ereg3系列,適用於大多數字符編碼。

經過在程序的開頭使用preg或mb_ereg進行包含空字節的控制字符校驗,可以同時進行應用規格中的字符種類校驗和空字節校驗。

 

4.輸入校驗與框架

在使用Web應用開發框架的狀況下,能夠利用框架中提供的輸入校驗功能,從而簡化開發流程。

 

5.「非控制字符的正則表達式」

"確認輸入值爲0-100的字符且不包含控制字符"

PHP(preg_match),使用POSIX字符集:

PHP(preg_match),Perl風格的\P{Cc}: 

PHP(mb_ereg),只能使用POSIX字符集: 

Perl能使用\P{Cc}來指定控制字符之外的字符。Perl中可使用正則表達式字面量,因此沒必要使用兩個\來轉義: 

Java(String類的matchs方法),匹配規則爲全體一致,因此正則表達式中沒必要使用\A和\z。Java中正則表達式的形式爲字符串,因此須要使用兩個\來轉義。 

VB.NET,.NET FRAMEWORK中提供了使用Regex類進行正則表達式查詢的功能。VB.NET的字符串字面量中不須要使用兩個\來轉義。 

相關文章
相關標籤/搜索