以前講述的很多關于sql防注入的代碼,但是還是得從我們的服務器腳本開始了,下面就來講述一個下php中防注入的一些常見方法大家可參考.
最常用見的可能就是:
首先將magic_quotes_gpc設置為On,display_errors設置為Off,如果id型,我們利用intval()將其轉換成整數類型,如代碼:$id=intval($id);
好了下面我來介紹php提交數據過濾的基本原則
1)提交變量進數據庫時,我們必須使用addslashes()進行過濾,像我們的注入問題,一個addslashes()也就搞定了,其實在涉及到變量取值時,intval()函數對字符串的過濾也是個不錯的選擇.
2)在php.ini中開啟magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie里的引號變為斜杠,magic_quotes_runtime對于進出數據庫的數據可以起到格式話的作用,其實,早在以前注入很瘋狂時,這個參數就很流行了.
3)在使用系統函數時,必須使用escapeshellarg(),escapeshellcmd()參數去過濾,這樣你也就可以放心的使用系統函數.
4)對于跨站,strip_tags(),htmlspecialchars()兩個參數都不錯,對于用戶提交的的帶有html和php的標記都將進行轉換,比如尖括號"<"就將轉化為 "<"這樣無害的字符。
代碼如下:
5)對于相關函數的過濾,就像先前的include(),unlink,fopen()等等,只要你把你所要執行操作的變量指定好或者對相關字符過濾嚴密,我想這樣也就無懈可擊了.
2、PHP簡單的數據過濾
1)入庫:trim($str),addslashes($str)
2)出庫:stripslashes($str)
3)顯示:htmlspecialchars(nl2br($str))
分享一個實例,具體的代碼如下:
- <?php
- //security.php
- /**
- * @author zhengwei
- * @copyright 2007
- */
- /*
- 函數名稱:inject_check()
- 函數作用:檢測提交的值是不是含有SQL注射的字符,防止注射,保護服務器安全
- 參 數:$sql_str: 提交的變量
- 返 回 值:返回檢測結果,ture or false
- 函數作者:heiyeluren
- */
- function inject_check($sql_str) {
- return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str); // 進行過濾
- } //開源代碼Vevb.com
- /*
- 函數名稱:verify_id()
- 函數作用:校驗提交的ID類值是否合法
- 參 數:$id: 提交的ID值
- 返 回 值:返回處理后的ID
- 函數作者:heiyeluren
- */
- function verify_id($id=null) {
- if (!$id) { exit('沒有提交參數!'); } // 是否為空判斷
- elseif (inject_check($id)) { exit('提交的參數非法!'); } // 注射判斷
- elseif (!is_numeric($id)) { exit('提交的參數非法!'); } // 數字判斷
- $id = intval($id); // 整型化
- return $id;
- }
- /*
- 函數名稱:str_check()
- 函數作用:對提交的字符串進行過濾
- 參 數:$var: 要處理的字符串
- 返 回 值:返回過濾后的字符串
- 函數作者:heiyeluren
- */
- function str_check( $str ) {
- if (!get_magic_quotes_gpc()) { // 判斷magic_quotes_gpc是否打開
- $str = addslashes($str); // 進行過濾
- }
- $str = str_replace("_", "_", $str); // 把 '_'過濾掉
- $str = str_replace("%", "%", $str); // 把 '%'過濾掉
- return $str;
- }
- /*
- 函數名稱:post_check()
- 函數作用:對提交的編輯內容進行處理
- 參 數:$post: 要提交的內容
- 返 回 值:$post: 返回過濾后的內容
- 函數作者:heiyeluren
- */
- function post_check($post) {
- if (!get_magic_quotes_gpc()) { // 判斷magic_quotes_gpc是否為打開
- $post = addslashes($post); // 進行magic_quotes_gpc沒有打開的情況對提交數據的過濾
- }
- $post = str_replace("_", "_", $post); // 把 '_'過濾掉
- $post = str_replace("%", "%", $post); // 把 '%'過濾掉
- $post = nl2br($post); // 回車轉換
- $post = htmlspecialchars($post); // html標記轉換
- return $post;
- }
- foreach ($_POST as $post_key=>$post_var)
- {
- if (is_numeric($post_var)) {
- $post[strtolower($post_key)] = get_int($post_var);
- } else {
- $post[strtolower($post_key)] = get_str($post_var);
- }
- }
- /* 過濾函數 */
- //整型過濾函數
- function get_int($number)
- {
- return intval($number);
- }
- //字符串型過濾函數
- function get_str($string)
- {
- if (!get_magic_quotes_gpc()) {
- return addslashes($string);
- }
- return $string;
- }
- ?>
在有些cms中我會看到如下代碼:
- foreach($HTTP_POST_VARS as $key=>$value){
- $ArrPostAndGet[]=$value;
- }
- foreach($HTTP_GET_VARS as $key=>$value){
- $ArrPostAndGet[]=$value;
- }
這個的代碼然后在所有頁面都加載這個函數,這樣過濾個人發現好像上傳文件時會有問題.
新聞熱點
疑難解答