<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                1.服務端進行CSRF防御 服務端的CSRF方式方法很多樣,但總的思想都是一致的,就是在客戶端頁面增加偽隨機數。 (1).Cookie Hashing(所有表單都包含同一個偽隨機值): 這可能是最簡單的解決方案了,因為攻擊者不能獲得第三方的Cookie(理論上),所以表單中的數據也就構造失敗了 (2).驗證碼   這個方案的思路是:每次的用戶提交都需要用戶在表單中填寫一個圖片上的隨機字符串,厄…這個方案可以完全解決CSRF,但個人覺得在易用性方面似乎不是太好,還有聽聞是驗證碼圖片的使用涉及了一個被稱為MHTML的Bug,可能在某些版本的微軟IE中受影響。 (3).One-Time Tokens(不同的表單包含一個不同的偽隨機值)   在實現One-Time Tokens時,需要注意一點:就是“并行會話的兼容”。如果用戶在一個站點上同時打開了兩個不同的表單,CSRF保護措施不應該影響到他對任何表單的提交。考慮一下如果每次表單被裝入時站點生成一個偽隨機值來覆蓋以前的偽隨機值將會發生什么情況:用戶只能成功地提交他最后打開的表單,因為所有其他的表單都含有非法的偽隨機值。必須小心操作以確保CSRF保護措施不會影響選項卡式的瀏覽或者利用多個瀏覽器窗口瀏覽一個站點。 2.預防xss攻擊 php防止XSS跨站腳本攻擊的方法:是針對非法的HTML代碼包括單雙引號等,使用htmlspecialchars()函數 。 在使用htmlspecialchars()函數的時候注意第二個參數, 直接用htmlspecialchars($string) 的話,第二個參數默認是ENT_COMPAT,函數默認只是轉化雙引號(“), 不對單引號(‘)做轉義 3.預防sql注入 1、php.ini 中把 safe_mode 打開 2、 safe_mode_gid = off 3、 關閉危險函數 ``` disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown ``` 4、 關閉PHP版本信息在http頭中的泄漏 expose_php = Off 5、 打開magic_quotes_gpc來防止SQL注入 magic_quotes_gpc = On 這個默認是關閉的,如果它打開后將自動把用戶提交對sql的查詢進行轉換 比如把 ’ 轉為 '等,這對防止sql注射有重大作用 6、錯誤信息控制 error_reporting = E_WARNING & E_ERROR 只顯示警告以上 7、 錯誤日志 建議在關閉display_errors后能夠把錯誤信息記錄下來,便于查找服務器運行的原因 ``` log_errors = On error_log = D:/usr/local/apache2/logs/php_error.log if (!get_magic_quotes_gpc()) { $lastname = addslashes($_POST[‘lastname’]); } else { $lastname = $_POST[‘lastname’]; } get_magic_quotes_gpc ``` 過濾后不用 addslashes 以免重復過濾 ``` <?php /** * php防止sql注入 * by www.httple.net */ 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 ; } ?> ``` 關于SQL注入,不得不說的是現在大多虛擬主機都會把magic_quotes_gpc選項打開,在這種情況下所有的客戶端GET和POST的數據都會自動進行addslashes處理,所以此時對字符串值的SQL注入是不可行的,但要防止對數字值的SQL注入,如用intval()等函數進行處理 例式2 ———————————————— ``` 防止sql注入的函數,過濾掉那些非法的字符,提高sql安全性,同時也可以過濾XSS的攻擊。 /** * php防止sql注入 * by www.httple.net */ function filter($str) { if (empty($str)) return false; $str = htmlspecialchars($str); $str = str_replace( '/', "", $str); $str = str_replace( '"', "", $str); $str = str_replace( '(', "", $str); $str = str_replace( ')', "", $str); $str = str_replace( 'CR', "", $str); $str = str_replace( 'ASCII', "", $str); $str = str_replace( 'ASCII 0x0d', "", $str); $str = str_replace( 'LF', "", $str); $str = str_replace( 'ASCII 0x0a', "", $str); $str = str_replace( ',', "", $str); $str = str_replace( '%', "", $str); $str = str_replace( ';', "", $str); $str = str_replace( 'eval', "", $str); $str = str_replace( 'open', "", $str); $str = str_replace( 'sysopen', "", $str); $str = str_replace( 'system', "", $str); $str = str_replace( '$', "", $str); $str = str_replace( "'", "", $str); $str = str_replace( "'", "", $str); $str = str_replace( 'ASCII 0x08', "", $str); $str = str_replace( '"', "", $str); $str = str_replace( '"', "", $str); $str = str_replace("", "", $str); $str = str_replace("&gt", "", $str); $str = str_replace("&lt", "", $str); $str = str_replace("<SCRIPT>", "", $str); $str = str_replace("</SCRIPT>", "", $str); $str = str_replace("<script>", "", $str); $str = str_replace("</script>", "", $str); $str = str_replace("select","",$str); $str = str_replace("join","",$str); $str = str_replace("union","",$str); $str = str_replace("where","",$str); $str = str_replace("insert","",$str); $str = str_replace("delete","",$str); $str = str_replace("update","",$str); $str = str_replace("like","",$str); $str = str_replace("drop","",$str); $str = str_replace("DROP","",$str); $str = str_replace("create","",$str); $str = str_replace("modify","",$str); $str = str_replace("rename","",$str); $str = str_replace("alter","",$str); $str = str_replace("cas","",$str); $str = str_replace("&","",$str); $str = str_replace(">","",$str); $str = str_replace("<","",$str); $str = str_replace(" ",chr(32),$str); $str = str_replace(" ",chr(9),$str); $str = str_replace(" ",chr(9),$str); $str = str_replace("&",chr(34),$str); $str = str_replace("'",chr(39),$str); $str = str_replace("<br />",chr(13),$str); $str = str_replace("''","'",$str); $str = str_replace("css","'",$str); $str = str_replace("CSS","'",$str); $str = str_replace("<!--","",$str); $str = str_replace("convert","",$str); $str = str_replace("md5","",$str); $str = str_replace("passwd","",$str); $str = str_replace("password","",$str); $str = str_replace("../","",$str); $str = str_replace("./","",$str); $str = str_replace("Array","",$str); $str = str_replace("or 1='1'","",$str); $str = str_replace(";set|set&set;","",$str); $str = str_replace("`set|set&set`","",$str); $str = str_replace("--","",$str); $str = str_replace("OR","",$str); $str = str_replace('"',"",$str); $str = str_replace("*","",$str); $str = str_replace("-","",$str); $str = str_replace("+","",$str); $str = str_replace("/","",$str); $str = str_replace("=","",$str); $str = str_replace("'/","",$str); $str = str_replace("-- ","",$str); $str = str_replace(" -- ","",$str); $str = str_replace(" --","",$str); $str = str_replace("(","",$str); $str = str_replace(")","",$str); $str = str_replace("{","",$str); $str = str_replace("}","",$str); $str = str_replace("-1","",$str); $str = str_replace("1","",$str); $str = str_replace(".","",$str); $str = str_replace("response","",$str); $str = str_replace("write","",$str); $str = str_replace("|","",$str); $str = str_replace("`","",$str); $str = str_replace(";","",$str); $str = str_replace("etc","",$str); $str = str_replace("root","",$str); $str = str_replace("//","",$str); $str = str_replace("!=","",$str); $str = str_replace("$","",$str); $str = str_replace("&","",$str); $str = str_replace("&&","",$str); $str = str_replace("==","",$str); $str = str_replace("#","",$str); $str = str_replace("@","",$str); $str = str_replace("mailto:","",$str); $str = str_replace("CHAR","",$str); $str = str_replace("char","",$str); return $str; } 更加簡便的防止sql注入的方法(推薦使用這個): if (!get_magic_quotes_gpc()) // 判斷magic_quotes_gpc是否為打開 { $post = addslashes($name); // magic_quotes_gpc沒有打開的時候把數據過濾 } $name = str_replace("_", "\_", $name); // 把 '_'過濾掉 $name = str_replace("%", "\%", $name); // 把' % '過濾掉 $name = nl2br($name); // 回車轉換 $name= htmlspecialchars($name); // html標記轉換 return $name; ``` ## 例式3 ``` <?php /** * php防止sql注入 * by www.httple.net */ //要過濾的非法字符 $ArrFiltrate=array("‘",";","union"); //出錯后要跳轉的url,不填則默認前一頁 $StrGoUrl=""; //是否存在數組中的值 function FunStringExist($StrFiltrate,$ArrFiltrate) { foreach ($ArrFiltrate as $key=>$value) { if (eregi($value,$StrFiltrate)) { return true; } } return false; } //合并$_POST 和 $_GET if(function_exists(array_merge)) { $ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS); } else { foreach($HTTP_POST_VARS as $key=>$value) { $ArrPostAndGet[]=$value; } foreach($HTTP_GET_VARS as $key=>$value) { $ArrPostAndGet[]=$value; } } //驗證開始 foreach($ArrPostAndGet as $key=>$value) { if (FunStringExist($value,$ArrFiltrate)) { echo "<script language="javascript">alert("非法字符");</script>"; if (emptyempty($StrGoUrl)) { echo "<script language="javascript">history.go(-1);</script>"; } else { echo "<script language="javascript">window.location="".$StrGoUrl."";</script>"; } exit; } } ?> ``` ## 例式4 ``` <?php /** * php防止sql注入 * by www.httple.net */ /* 過濾所有GET過來變量 */ foreach ($_GET as $get_key=>$get_var) { if (is_numeric($get_var)) { $get[strtolower($get_key)] = get_int($get_var); } else { $get[strtolower($get_key)] = get_str($get_var); } } /* 過濾所有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; } ?> ``` ## 例式5 ``` <?php /** * php防止sql注入 * by www.httple.net */ class sqlsafe { private $getfilter = "'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; private $postfilter = "\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; private $cookiefilter = "\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; /** * 構造函數 */ public function __construct() { foreach($_GET as $key=>$value){$this->stopattack($key,$value,$this->getfilter);} foreach($_POST as $key=>$value){$this->stopattack($key,$value,$this->postfilter);} foreach($_COOKIE as $key=>$value){$this->stopattack($key,$value,$this->cookiefilter);} } /** * 參數檢查并寫日志 */ public function stopattack($StrFiltKey, $StrFiltValue, $ArrFiltReq){ if(is_array($StrFiltValue))$StrFiltValue = implode($StrFiltValue); if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue) == 1){ $this->writeslog($_SERVER["REMOTE_ADDR"]." ".strftime("%Y-%m-%d %H:%M:%S")." ".$_SERVER["PHP_SELF"]." ".$_SERVER["REQUEST_METHOD"]." ".$StrFiltKey." ".$StrFiltValue); showmsg('您提交的參數非法,系統已記錄您的本次操作!','',0,1); } } /** * SQL注入日志 */ public function writeslog($log){ $log_path = CACHE_PATH.'logs'.DIRECTORY_SEPARATOR.'sql_log.txt'; $ts = fopen($log_path,"a+"); fputs($ts,$log."\r\n"); fclose($ts); } } ?> ``` ## PHP防XSS 防SQL注入的代碼 ``` /** * 過濾參數 * @param string $str 接受的參數 * @return string */ static public function filterWords($str) { $farr = array( "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU", "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU", "/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is" ); $str = preg_replace($farr,'',$str); return $str; } /** * 過濾接受的參數或者數組,如$_GET,$_POST * @param array|string $arr 接受的參數或者數組 * @return array|string */ static public function filterArr($arr) { if(is_array($arr)){ foreach($arr as $k => $v){ $arr[$k] = self::filterWords($v); } }else{ $arr = self::filterWords($v); } return $arr; } ``` 在防止被注入攻擊時,常會用到兩個函數:htmlspecialchars()和addslashes() 、trim()函數。這兩個函數都是對特殊字符進行轉義。 1)addslashes()作用及使用 addslashes()通常用于防止sql注入,它可對通過get,post和cookie傳遞過來的參數的單引號和雙引號已經null前加“\”進行轉義 如:如變量s t r = str=str=_POST[“str”];的值為:bb’ or 1=‘1。通過addslashes()函數過濾后會變為:bb’ or 1='1; 2)htmlspecialchars()作用及使用 htmlspecialchars()也是對字符進行轉義,與addslashes()不同的是htmlspecialchars()是將特殊字符用引用實體替換。 如通過htmlspecialchars()過濾后為 3)addslashes()與htmlspecialchars()的區別 除了兩個函數的轉義方式不同外,它們的使用也不同。 addslashes()通過用于防止sql語句注入,在執行sql語句前對通過get、post和cookie傳遞來的參數中的單引號,雙引號,\ 和null進行轉義。 但sql執行成功后,插入到數據庫中的數據是不帶有轉義字符\的。這是如果插入到數據庫中的是一些js腳本,當這些腳本被讀取出來時還是會被執行。 這是我們可對讀取出來的數據使用htmlspecialchars()進行過濾,避免執行被注入的腳本。