亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

php安全問題思考

alphahans / 2540人閱讀

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

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

一、防止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)義字符處理不當

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...

2. 類型處理不當
// 構(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. 查詢語句組織不當

user.php?table=user&

4. 錯誤處理不當

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

// 構(gòu)造動態(tài)查詢語句

$getid?=?"select?*?from?tbl?where?userid?>?1";

// 執(zhí)行SQL語句

$res = mysql_query($getid) or die("
".mysql_error()."
");
5. 多個提交處理不當
// 參數(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ù)定義的字符是:

& (和號)    成為 &
” (雙引號)  成為 "
‘ (單引號)  成為 '
< (小于)    成為 <
> (大于)    成為 >

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

函數(shù)原型:htmlspecialchars_decode(string,quotestyle)

二、防止xss攻擊

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

比如你寫個留言本,有人去留言寫

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

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

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

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

";
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í)行的語句
    //需求:往學生表里循環(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);

原始鏈接方法:

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    
$dbh->exec("set names utf8");   

$title    = "我們的愛情";
$content  = "你是/誰啊,大幾都"老梁"做做&>women沒" . " 測試打印號"我是單引號"哈哈";
$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是將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é)當調(diào)用 prepare() 時,查詢語句已經(jīng)發(fā)送給了數(shù)據(jù)庫服務(wù)器,此時只有占位符 ? 發(fā)送過去,沒有用戶提交的數(shù)據(jù);當調(diào)用到 execute()時,用戶提交過來的值才會傳送給數(shù)據(jù)庫,他們是分開傳送的,兩者獨立的,SQL攻擊者沒有一點機會。

相關(guān)文章:
php-PDO預(yù)處理    
PHP MySQL 預(yù)處理語句
pdo如何防止 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中查看
當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(
        ""]*?>.*?"is",
        ""]*?>.*?"is",
        ""]*?>.*?"is",
        ""]*?>.*?"is",
        ""]*?>.*?"is",
        ""]*?>"is",
        ""]*?>"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("http://", "\", $content);

    // 4.替換斜杠
    $content = preg_replace("http:///", "/", $content);
     
     return $content;
}

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

相關(guān)文章:
PHP 安全三板斧:過濾、驗證和轉(zhuǎn)義之轉(zhuǎn)義篇 & Blade模板引擎避免XSS攻擊原理探究
8個很有用的PHP安全函數(shù),你知道幾個?
HTML 字符實體對照表
PDO使用方法簡介
利用SQL注入漏洞登錄后臺

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/21855.html

相關(guān)文章

  • 起步-學習php擴展開發(fā)的背景

    摘要:開發(fā)擴展是用語言實現(xiàn)的,流行的很大一個原因也是因為有大量開發(fā)者通過擴展實現(xiàn)大量通用的功能供廣大社區(qū)開發(fā)者使用。擴展化的優(yōu)勢產(chǎn)品安全性和私密性好系統(tǒng)性能高擴展化的劣勢開發(fā)效率低的優(yōu)勢之一就是開發(fā)效率高,需要選擇系統(tǒng)合適的模塊進行擴展化。 php是解釋性語言,不需要編譯。對于用php寫的產(chǎn)品,如果需要直接源碼安裝到客戶的運行環(huán)境中,則存在很大的安全隱患??蛻羯踔量梢园涯愕漠a(chǎn)品直接做二次部署...

    joyqi 評論0 收藏0
  • 我在全球最大的同性社交平臺那點事

    摘要:從最大的同性社交平臺獲取數(shù)據(jù)好了,言歸正傳,回到題目。烏云密布的爬蟲百度網(wǎng)盤這件事,是我不想看到的,這類安全問題的一個共同特點用戶自身確實存在問題。 本文作者:夏之冰雪,i春秋簽約作家 《我在百度網(wǎng)盤上看到上萬條車主個人信息,企業(yè)、政府高官信息、各種數(shù)據(jù)庫和無窮無盡的盜版》,一時間,這篇文章就火了,火爆程度另百度猝不及防。 其實呢,這事真不能全怪百度,畢竟用戶分享出去了。之所以引起這么...

    AlphaWatch 評論0 收藏0
  • 對一個“老”架構(gòu)的重新思考

    摘要:常見的就是,它是一個完整的目錄。的特點是簡單,使用一個中央版本庫。當初公司的日均均超過,所以采用的是方案雙機熱備集群優(yōu)化架構(gòu)圖上是兩主兩從。 前言 五年前,我在CNBLOG寫的一篇文章,《php+mysql下,對網(wǎng)站架構(gòu)方面的一些認識(以我維護的站點為例)》,當然,整套架構(gòu)不是做的,而是配合當初的運維部門,共同完成。那個時候我從入行PHP兩年,對所謂的架構(gòu)也是懵懂。只覺得很深奧,很高大...

    J4ck_Chan 評論0 收藏0
  • 對一個“老”架構(gòu)的重新思考

    摘要:常見的就是,它是一個完整的目錄。的特點是簡單,使用一個中央版本庫。當初公司的日均均超過,所以采用的是方案雙機熱備集群優(yōu)化架構(gòu)圖上是兩主兩從。 前言 五年前,我在CNBLOG寫的一篇文章,《php+mysql下,對網(wǎng)站架構(gòu)方面的一些認識(以我維護的站點為例)》,當然,整套架構(gòu)不是做的,而是配合當初的運維部門,共同完成。那個時候我從入行PHP兩年,對所謂的架構(gòu)也是懵懂。只覺得很深奧,很高大...

    Crazy_Coder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<