1. 程式人生 > >php對前臺提交的表單資料做安全處理(防SQL注入和XSS攻擊等)

php對前臺提交的表單資料做安全處理(防SQL注入和XSS攻擊等)

/**
     * 防sql注入字串轉義
     * @param $content 要轉義內容
     * @return array|string
     */
    public static function escapeString($content) {
        $pattern = "/(select[\s])|(insert[\s])|(update[\s])|(delete[\s])|(from[\s])|(where[\s])|(drop[\s])/i";
        if (is_array($content)) {
            foreach ($content as $key=>$value) {
                $content[$key] = addslashes(trim($value));
                if(preg_match($pattern,$content[$key])) {
                    $content[$key] = '';
                }
            }
        } else {
            $content=addslashes(trim($content));
            if(preg_match($pattern,$content)) {
                $content = '';
            }
        }
        return $content;
    }

防XSS攻擊程式碼:

/**
 * 安全過濾函式
 *
 * @param $string
 * @return string
 */
function safe_replace($string) {
    $string = str_replace('%20','',$string);
    $string = str_replace('%27','',$string);
    $string = str_replace('%2527','',$string);
    $string = str_replace('*','',$string);
    $string = str_replace('"','"',$string);
    $string = str_replace("'",'',$string);
    $string = str_replace('"','',$string);
    $string = str_replace(';','',$string);
    $string = str_replace('<','&lt;',$string);
    $string = str_replace('>','&gt;',$string);
    $string = str_replace("{",'',$string);
    $string = str_replace('}','',$string);
    $string = str_replace('\\','',$string);
    return $string;
}

程式碼例項:

<?php
$user_name = strim($_REQUEST['user_name']);

function strim($str)
{
    //trim() 函式移除字串兩側的空白字元或其他預定義字元。
    //htmlspecialchars() 函式把預定義的字元轉換為 HTML 實體(防xss攻擊)。
    //預定義的字元是:
    //& (和號)成為 &amp;
    //" (雙引號)成為 &quot;
    //' (單引號)成為 '
    //< (小於)成為 &lt;
    //> (大於)成為 &gt;
    return quotes(htmlspecialchars(trim($str)));
}
//防sql注入
function quotes($content)
{
    //if $content is an array
    if (is_array($content))
    {
        foreach ($content as $key=>$value)
        {
            //$content[$key] = mysql_real_escape_string($value);
            /*addslashes() 函式返回在預定義字元之前新增反斜槓的字串。
            預定義字元是:
            單引號(')
            雙引號(")
            反斜槓(\)
            NULL */
            $content[$key] = addslashes($value);
        }
    } else
    {
        //if $content is not an array
        //$content=mysql_real_escape_string($content);
        $content=addslashes($content);
    }
    return $content;
}

?>
//過濾sql注入
function filter_injection(&$request)
{
    $pattern = "/(select[\s])|(insert[\s])|(update[\s])|(delete[\s])|(from[\s])|(where[\s])/i";
    foreach($request as $k=>$v)
    {
                if(preg_match($pattern,$k,$match))
                {
                        die("SQL Injection denied!");
                }

                if(is_array($v))
                {
                    filter_injection($request[$k]);
                }
                else
                {
                    if(preg_match($pattern,$v,$match))
                    {
                        die("SQL Injection denied!");
                    }
                }
    }

}

防sql注入: 
mysql_real_escape_string() 函式轉義 SQL 語句中使用的字串中的特殊字元。 
下列字元受影響: 
\x00 
\n 
\r 

’ 
” 
\x1a 
如果成功,則該函式返回被轉義的字串。如果失敗,則返回 false。 
語法 
mysql_real_escape_string(string,connection) 
引數 描述 
string 必需。規定要轉義的字串。 
connection 可選。規定 MySQL 連線。如果未規定,則使用上一個連線。

對於純數字或數字型字串的校驗可以用 
is_numeric()檢測變數是否為數字或數字字串 
例項:

<?php 
function get_numeric($val) { 
  if (is_numeric($val)) { 
    return $val + 0; 
  } 
  return 0; 
} 
?>

is_array — 檢測變數是否是陣列 
bool is_array ( mixed $var ) 
如果 var 是 array,則返回 TRUE,否則返回 FALSE。

is_dir 判斷給定檔名是否是一個目錄 
bool is_dir ( string $filename ) 
判斷給定檔名是否是一個目錄。 
如果檔名存在,並且是個目錄,返回 TRUE,否則返回FALSE。

is_file — 判斷給定檔名是否為一個正常的檔案 
bool is_file ( string $filename ) 
判斷給定檔名是否為一個正常的檔案。 
如果檔案存在且為正常的檔案則返回 TRUE,否則返回 FALSE。 
Note: 因為 PHP 的整數型別是有符號整型而且很多平臺使用 32 位整型,對 2GB 以上的檔案,一些檔案系統函式可能返回無法預期的結果 。

is_bool — 檢測變數是否是布林型 
bool is_bool ( mixed $var )如果 var 是 boolean 則返回 TRUE。

is_string — 檢測變數是否是字串 
bool is_string ( mixed $var ) 
如果 var 是 string 則返回 TRUE,否則返回 FALSE。

is_int — 檢測變數是否是整數 
bool is_int ( mixed $var ) 
如果 var 是 integer 則返回 TRUE,否則返回 FALSE。 
Note: 
若想測試一個變數是否是數字或數字字串(如表單輸入,它們通常為字串),必須使用 is_numeric()。

is_float — 檢測變數是否是浮點型 
bool is_float ( mixed $var ) 
如果 var 是 float 則返回 TRUE,否則返回 FALSE。 
Note: 
若想測試一個變數是否是數字或數字字串(如表單輸入,它們通常為字串),必須使用 is_numeric()。

is_null — 檢測變數是否為 NULL 
bool is_null ( mixed $var ) 
如果 var 是 null 則返回 TRUE,否則返回 FALSE。

is_readable — 判斷給定檔名是否可讀 
bool is_readable ( string $filename )判斷給定檔名是否存在並且可讀。如果由 filename 指定的檔案或目錄存在並且可讀則返回 TRUE,否則返回 FALSE。

is_writable — 判斷給定的檔名是否可寫 
bool is_writable ( string $filename ) 
如果檔案存在並且可寫則返回 TRUE。filename 引數可以是一個允許進行是否可寫檢查的目錄名。

file_exists — 檢查檔案或目錄是否存在 
bool file_exists ( string $filename ) 
檢查檔案或目錄是否存在。 
在 Windows 中要用 //computername/share/filename 或者 \computername\share\filename 來檢查網路中的共享檔案。 
如果由 filename 指定的檔案或目錄存在則返回 TRUE,否則返回 FALSE。

is_executable — 判斷給定檔名是否可執行 
bool is_executable ( string $filename )判斷給定檔名是否可執行。如果檔案存在且可執行則返回 TRUE,錯誤時返回FALSE。

轉載自:https://blog.csdn.net/u013372487/article/details/51516186