久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      php安全問題思考

      用戶提交過來的數(shù)據(jù)都是不可信的,所以,在查庫或入庫前需要對提交過來的數(shù)據(jù)進行過濾或字符的轉(zhuǎn)換處理,以防止SQL注入或xss攻擊等問題。

      推薦:【PHP教程】

      一、防止SQL注入

      什么是SQL注入攻擊?

      所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務(wù)器執(zhí)行惡意的SQL命令。

      尋找SQL注入的方法:

      1.通過get請求

      2.通過post請求

      3.其他http請求,如cookie

      常見的SQL注入問題:

      數(shù)據(jù)庫查詢參數(shù)的類型轉(zhuǎn)換處理

      1. 轉(zhuǎn)義字符處理不當(dāng)

      Talk is cheap,Show me the code.

      多說無益,代碼亮出來吧!

      // 構(gòu)造動態(tài)SQL語句   $sql = "select * from tbl where field = '$_GET['input']'";   // 執(zhí)行SQL語句   $res = mysql_query($sql);

      測試:

      在下邊的網(wǎng)址后邊加一個單引號,就會報數(shù)據(jù)庫錯誤

      http://testphp.vulnweb.com/ar…

      php安全問題思考

      2. 類型處理不當(dāng)

      // 構(gòu)造動態(tài)SQL語句 $sql = "select * from tbl where field = $_GET['user_id']"; // 執(zhí)行SQL語句  $res = mysql_query($sql);

      Mysql內(nèi)置了一個命令,可以讀取文件

      Union all select load_file('/etc/passwd')-- select * from tbl where userid = 1 union all select load_file('etc/passwd')--

      該命令會獲取數(shù)據(jù)庫管理員的密碼。

      處理方法:

      需要將客戶端傳過來的數(shù)據(jù)進行類型強制轉(zhuǎn)換,而后再查詢

      $user_id = (int)$_GET['user_id']; "select * from tbl where userid = {$user_id}";

      3. 查詢語句組織不當(dāng)

      user.php?table=user&

      4. 錯誤處理不當(dāng)

      即將站點的錯誤信息暴漏給用戶,這樣非常危險。

      // 構(gòu)造動態(tài)查詢語句 $getid = "select * from tbl where userid > 1"; // 執(zhí)行SQL語句 $res = mysql_query($getid) or die('<pre>'.mysql_error().'</pre>'); 5. 多個提交處理不當(dāng) // 參數(shù)是否是一個字符串 if(is_string($_GET["param"])){}

      數(shù)據(jù)入庫時將轉(zhuǎn)換單引號、雙引號、反斜杠為實體

      在入庫的時候如果不過濾 ' ""這樣的東西,這樣會使數(shù)據(jù)庫報錯,或者注入等問題。

      先將字符串用htmlspecialchars()轉(zhuǎn)換為實體后存儲到數(shù)據(jù)庫,然后從數(shù)據(jù)庫讀出來時htmlspecialchars_decode()轉(zhuǎn)為HTML標簽。

      htmlspecialchars() 函數(shù)把一些預(yù)定義的字符轉(zhuǎn)換為 HTML 實體。

      函數(shù)原型:

      htmlspecialchars(string,quotestyle,character-set)

      預(yù)定義的字符是:

      & (和號)    成為 &amp; ” (雙引號)  成為 &quot; ‘ (單引號)  成為 &#039; < (小于)    成為 &lt; > (大于)    成為 &gt;

      htmlspecialchars_decode() 函數(shù)把一些預(yù)定義的 HTML 實體轉(zhuǎn)換為字符(和htmlspecialchars相反)。

      函數(shù)原型:

      htmlspecialchars_decode(string,quotestyle)

      二、防止xss攻擊

      什么是xss攻擊?

      和上邊的sql注入不同的是,xss攻擊是合法的字符串,如經(jīng)過htmlspecialchars()方法實體化后,可以保存在數(shù)據(jù)庫中,但是,當(dāng)訪問含有該字符串的內(nèi)容頁面時,就會出現(xiàn)問題,如字符串里邊還有JavaScript,frame代碼,原來的頁面就會被篡改。

      比如你寫個留言本,有人去留言寫<script src="xx"></script><iframe>,這個被顯出來容易掛病毒都很容易,和數(shù)據(jù)庫無關(guān)。

      XSS概念

      XSS又稱CSS,全稱Cross SiteScript(跨站腳本攻擊), XSS攻擊類似于SQL注入攻擊,是Web程序中常見的漏洞,XSS屬于被動式且用于客戶端的攻擊方式,所以容易被忽略其危害性。其原理是攻擊者向有XSS漏洞的網(wǎng)站中輸入(傳入)惡意的HTML代碼,當(dāng)用戶瀏覽該網(wǎng)站時,這段HTML代碼會自動執(zhí)行,從而達到攻擊的目的。如,盜取用戶Cookie信息、破壞頁面結(jié)構(gòu)、重定向到其它網(wǎng)站等。

      理論上,只要存在能提供輸入的表單并且沒做安全過濾或過濾不徹底,都有可能存在XSS漏洞。

      下面是一些最簡單并且比較常見的惡意字符XSS輸入:

      1.XSS 輸入通常包含 JavaScript 腳本,如彈出惡意警告框:<script>alert("XSS");</script>

      2.XSS 輸入也可能是 HTML 代碼段,譬如:

      (1).網(wǎng)頁不停地刷新 <meta http-equiv="refresh" content="0;">

      (2).嵌入其它網(wǎng)站的鏈接 <iframe src=http://xxxx width=250 height=250></iframe>

      除了通過正常途徑輸入XSS攻擊字符外,還可以繞過JavaScript校驗,通過修改請求達到XSS攻擊的目的,如下圖:

      了解到XSS攻擊的原理和危害后,其實要預(yù)防也不難,下面提供一個簡單的PHP防止XSS攻擊的函數(shù):

      除了通過正常途徑輸入XSS攻擊字符外,還可以繞過JavaScript校驗,通過修改請求達到XSS攻擊的目的。

      了解到XSS攻擊的原理和危害后,其實要預(yù)防也不難,下面提供一個簡單的PHP防止XSS攻擊的函數(shù):

      <?PHP /**  * @blog http://www.digtime.cn  * @param $string  * @param $low 安全別級低  */ function clean_xss(&$string, $low = False) {     if (! is_array ( $string ))     {         $string = trim ( $string );         $string = strip_tags ( $string );         $string = htmlspecialchars ( $string );         if ($low)         {             return True;         }         $string = str_replace ( array ('"', "\", "'", "/", "..", "../", "./", "//" ), '', $string );         $no = '/%0[0-8bcef]/';         $string = preg_replace ( $no, '', $string );         $no = '/%1[0-9a-f]/';         $string = preg_replace ( $no, '', $string );         $no = '/[x00-x08x0Bx0Cx0E-x1Fx7F]+/S';         $string = preg_replace ( $no, '', $string );         return True;     }     $keys = array_keys ( $string );     foreach ( $keys as $key )     {         clean_xss ( $string [$key] );     } } //just a test $str = 'codetc.com<meta http-equiv="refresh" content="0;">'; clean_xss($str); //如果你把這個注釋掉,你就知道xss攻擊的厲害了 echo $str; ?>

      避免被XSS:

      1.給用戶開放的編輯器盡量過濾掉危險的代碼

      如果是html編輯器,一般的做法是保留大部分代碼,過濾部分可能存在危險的代碼,如script, iframe等等

      三、PHP MySQL 預(yù)處理語句

      預(yù)處理語句對于防止 MySQL 注入是非常有用的。

      預(yù)處理語句及綁定參數(shù)

      預(yù)處理語句用于執(zhí)行多個相同的 SQL 語句,并且執(zhí)行效率更高。

      預(yù)處理語句的工作原理如下:

      預(yù)處理:創(chuàng)建 SQL 語句模板并發(fā)送到數(shù)據(jù)庫。預(yù)留的值使用參數(shù) "?" 標記 。例如:

      INSERT      INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?)

      數(shù)據(jù)庫解析,編譯,對SQL語句模板執(zhí)行查詢優(yōu)化,并存儲結(jié)果不輸出。

      執(zhí)行:最后,將應(yīng)用綁定的值傳遞給參數(shù)("?" 標記),數(shù)據(jù)庫執(zhí)行語句。應(yīng)用可以多次執(zhí)行語句,如果參數(shù)的值不一樣。

      相比于直接執(zhí)行SQL語句,預(yù)處理語句有兩個主要優(yōu)點:

      預(yù)處理語句大大減少了分析時間,只做了一次查詢(雖然語句多次執(zhí)行)。

      綁定參數(shù)減少了服務(wù)器帶寬,你只需要發(fā)送查詢的參數(shù),而不是整個語句。

      預(yù)處理語句針對SQL注入是非常有用的,因為參數(shù)值發(fā)送后使用不同的協(xié)議,保證了數(shù)據(jù)的合法性。

      PDO預(yù)處理機制

      可以使用多種方式實現(xiàn)預(yù)處理:指的是在綁定數(shù)據(jù)進行執(zhí)行的時候,可以有多種方式。

      預(yù)處理語句中為變量

      使用數(shù)組指定預(yù)處理變量

        1、準備預(yù)處理語句(發(fā)送給服務(wù)器,讓服務(wù)器準備預(yù)處理語句)

      PDOStatement PDO::prepare:類似exec將一條SQL語句發(fā)送給Mysql服務(wù)器       //PDO::prepare 能夠自動的準備一個預(yù)處理語句,用戶需要準備的只是預(yù)處理所要執(zhí)行的語句     //需求:往學(xué)生表里循環(huán)插入10條記錄     //PDO的預(yù)處理能夠自動的將對應(yīng)的以:開始的變量給記錄下來,實際發(fā)送給服務(wù)器的是“?”     $sql1 = "insert into pro_student values(null,:s_name,:s_num,:s_gender,:s_age,:c_id)";

        2、發(fā)送預(yù)處理語句

      $stmt = $pdo->prepare($sql1);

        3、給預(yù)處理綁定數(shù)據(jù)

      $arr = array(       ':s_name' => '房祖名',       ':s_num' => 'itcast0013',       ':s_gender' => 0,       ':s_age' => 28,       ':c_id' => 2     );

        4、執(zhí)行預(yù)處理:將要操作的數(shù)據(jù)發(fā)送給預(yù)處理語句,再執(zhí)行預(yù)處理語句

      PDOStatement::execute([$array]):數(shù)組用來傳遞對應(yīng)的參數(shù)     $stmt->execute($arr); //執(zhí)行預(yù)處理

      PDO預(yù)處理原理

      PDO的預(yù)防sql注入的機制也是類似于使用mysql_real_escape_string 進行轉(zhuǎn)義,PDO 有兩種轉(zhuǎn)義的機制,第一種是本地轉(zhuǎn)義,這種轉(zhuǎn)義的方式是使用單字節(jié)字符集(PHP < 5.3.6)來轉(zhuǎn)義的(單字節(jié)與多字節(jié)),來對輸入進行轉(zhuǎn)義,但是這種轉(zhuǎn)義方式有一些隱患。隱患主要是:在PHP版本小于5.3.6的時候,本地轉(zhuǎn)義只能轉(zhuǎn)換單字節(jié)的字符集,大于 5.3.6 的版本會根據(jù) PDO 連接中指定的 charset 來轉(zhuǎn)義。

      第二種方式是PDO,首先將 sql 語句模板發(fā)送給Mysql Server,隨后將綁定的字符變量再發(fā)送給Mysql server,這里的轉(zhuǎn)義是在Mysql Server做的,它是根據(jù)你在連接PDO的時候,在charset里指定的編碼格式來轉(zhuǎn)換的。這樣的轉(zhuǎn)義方式更健全,同時還可以在又多次重復(fù)查詢的業(yè)務(wù)場景下,通過復(fù)用模板,來提高程序的性能。如果要設(shè)置Mysql Server 來轉(zhuǎn)義的話,就要首先執(zhí)行:

      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

      原始鏈接方法:

      <?php   // PDO的使用 // http://blog.csdn.net/qq635785620/article/details/11284591 $dbh = new PDO('mysql:host=127.0.0.1:3306;dbname=mysql_safe', 'root', '518666');    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);     $dbh->exec('set names utf8');    $title    = "我們的愛情"; $content  = '你是/誰啊,大幾都"老梁"做做&>women<a>沒' . " 測試打印號'我是單引號'哈哈"; $user_id  = 174742; $add_time = date("Y-m-d H:i:s"); $insert_sql = "insert into post_tbl (title, content, user_id, add_time) values (:x_title, :x_content, :x_user_id, :x_add_time)"; $stmt = $dbh->prepare($insert_sql);  $stmt->execute(array('x_title'=>$title,':x_content'=> $content, ':x_user_id' => $user_id, ':x_add_time' => $add_time));     echo $dbh->lastinsertid();

      php安全問題思考

      可見這次PHP是將SQL模板和變量是分兩次發(fā)送給MySQL的,由MySQL完成變量的轉(zhuǎn)義處理,既然變量和SQL模板是分兩次發(fā)送的,那么就不存在SQL注入的問題了,但需要在DSN中指定charset屬性,如:

      $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root');

      示例:

      /** *  插入用戶的Token */ function photo_save_token($user_id, $token) {     // 參數(shù)判斷     $user_id = (int)$user_id;     $token = trim($token);        if(empty($token) || empty($user_id)) return false;     $sql = "replace into token_db.app_token_tbl ( user_id, token, t_date, last_open_time) values ( :x_user_id, :x_token, :x_t_date, :x_last_open_time)";     sqlSetParam($sql,"x_user_id",$user_id);     sqlSetParam($sql,"x_token",$token);     sqlSetParam($sql,"x_t_date",date('Y-m-d H:i:s'));     sqlSetParam($sql,"x_last_open_time", time());     return mysql_query($sql); }

      總結(jié): 當(dāng)調(diào)用 prepare() 時,查詢語句已經(jīng)發(fā)送給了數(shù)據(jù)庫服務(wù)器,此時只有占位符 ? 發(fā)送過去,沒有用戶提交的數(shù)據(jù);當(dāng)調(diào)用到 execute()時,用戶提交過來的值才會傳送給數(shù)據(jù)庫,他們是分開傳送的,兩者獨立的,SQL攻擊者沒有一點機會。

      小結(jié)

      ①、關(guān)于sql注入可以使用htmlspecialchars()或addslashes()方法,如果連接mysql,可以用mysql_real_escape_string(),還有在php.ini中配置magic_quotes_gpc開啟自動轉(zhuǎn)義的擴展。

      PHP環(huán)境打開自動轉(zhuǎn)義,PHP.INI中查看

      當(dāng)magic_quotes_gpc=on 時將自動進行轉(zhuǎn)義(默認是on),可在程序中用get_magic_quotes_gpc()檢查他的狀態(tài)

      程序為:

      if (get_magic_quotes_gpc()==1){      $name=stripcslashes($_POST["name"]);        }else{      $name=$_POST["name"]; }

      ②、關(guān)于xss攻擊可以寫一個去處script,frame等代碼的方法:

      直接用這個函數(shù)editor_safe_replace代替htmlspecialchars,既保證安全又能用大部分html代碼

      function editor_safe_replace($content) {    $content = trim($content);     $tags = array(         "'<iframe[^>]*?>.*?</iframe>'is",         "'<frame[^>]*?>.*?</frame>'is",         "'<script[^>]*?>.*?</script>'is",         "'<head[^>]*?>.*?</head>'is",         "'<title[^>]*?>.*?</title>'is",         "'<meta[^>]*?>'is",         "'<link[^>]*?>'is",     );              // 1.先過濾掉含有xss攻擊的代碼     $content = preg_replace($tags, "", $content);           // strip_tags過濾掉全部HTML標簽(script,iframe,head,a 等標簽)和上邊的正則方法類似      // $content = strip_tags($content);          // 2.入庫時,防止sql注入,轉(zhuǎn)為HTML實體保存在數(shù)據(jù)庫,單雙引號都轉(zhuǎn)      $content = htmlspecialchars($content, ENT_QUOTES);           // 3.替換反斜杠     $content = preg_replace("/\/", "&#092;", $content);     // 4.替換斜杠     $content = preg_replace("///", "&#47;", $content);            return $content; }

      所以,對于PHP的安全而言,一定要對用戶提交的數(shù)據(jù)進行過濾校驗處理,即先防止SQL注入,后再進行XSS過濾,這兩個都需要兩手一起抓,且兩手都要硬,否則,你的網(wǎng)站將會存在很大的安全風(fēng)險。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號