2013-03-18 71 views
12

我對PDO相當陌生,想知道下面的查詢是否是從SQL注入安全的。如果是的話,我會在整個網站中使用這種方法。我的PDO查詢安全嗎SQL注入

// make connection to DB 
$db = new PDO('mysql:host='.$dateBaseHost.';dbname='.$dateBaseName, $dateBaseUsername, $dateBasePassword); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 


//simple query and binding with results 
$query = $db->prepare(" SELECT * FROM `profile` WHERE `fullname` = :fullname "); 

$search = (isset($_GET['search']) === true) ? $_GET['search'] : '' ; // ? : shorthand for if else 

// bind parameters - avoids SQL injection 
$query->bindValue(':fullname', $search); 

//try... if not catch exception 
try { 
    // run the query 
    $query->execute(); 

    $rows = $query->fetchAll(PDO::FETCH_ASSOC); 
    echo '<pre>', print_r($rows, true),'</pre>'; 
} 
catch (PDOException $e){ 
    sendErrorMail($e->getMessage(), $e->getFile(), $e->getLine()); 
} 
+0

只要您使用參數化,查詢您的查詢是安全的。 – Rohitink 2013-03-18 16:36:03

+0

是的。您正在使用參數化,它將自動進行必要的轉義。好東西! – halfer 2013-03-18 16:36:17

回答

8

是的 - 當以這種方式使用時,參數化查詢是安全的注入。

+0

它只是安全的基礎攻擊... – 2017-02-04 11:41:30

5

只要您正確使用準備好的語句,就可以避免注入。但只要你直接插入任何外部數據到一個查詢,即使它是否是一個準備好的陳述,例如,

INSERT INTO $table VALUES (:param) 

你是脆弱的 - $table在這種情況下被破壞,即使您使用的是事先準備好的聲明。

任何人告訴你簡單地切換mysql-> PDO或mysqli會讓你更安全的是平坦的錯誤。無論是哪種庫,您都可能會受到注入攻擊。

0

是的,這是相當安全的,但整個腳本可以改進:

if (isset($_GET['search']) { 
    // make connection to DB 
    $opt = array(
     PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION, 
     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC 
    ); 
    $dsn = "mysql:host=$dateBaseHost;dbname=$dateBaseName;charset=$dateBaseCharset"; 
    $db = new PDO($dsn, $dateBaseUsername, $dateBasePassword, $opt); 

    //simple query and binding with results 
    $query = $db->prepare("SELECT * FROM profile WHERE fullname = ?"); 
    $query->execute(array($_GET['search'])); 
    $rows = $query->fetchAll(); 
    echo '<pre>', print_r($rows, true),'</pre>'; 
} 
  • 需要設置errmode作爲連接選項
  • 從未使用在try..catch處理錯誤消息。如果你想每個錯誤都有電子郵件(這太瘋狂了),你必須爲此設置my_exception handler()
  • 設置搜索空字符串沒有任何意義
  • 連接到PDO應該被移動,以便單獨的文件(未顯示)
  • 字符集已經在DSN設置
+1

爲什麼你應該**從不**使用try ... catch來處理錯誤?他們在所有的文件中都有。? – 2013-11-07 01:18:21

+0

我naver說「錯誤」,但「錯誤信息」。是的,他們有這一切錯誤 – 2013-11-07 05:01:28

+0

我想知道你對Marc B的回答和解決方案的看法。 – 2017-07-20 03:01:51

3

你也應該

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

默認情況下,它使用仿真模式,它只是做mysql_real_escape_string所做的。在某些邊緣情況下,您仍然容易受到SQL注入的影響。

+0

太好了我會說 – 2013-03-18 16:54:13

+0

@YourCommonSense:但仍然很重要,請參閱複製的答案,尤其是[這一個](http://stackoverflow.com/a/12202218/258127)。 – 2013-03-18 16:57:49

+0

這實際上是做什麼的? – user2183216 2013-03-18 17:07:19