2012-12-02 40 views
0

可能重複:
Are PDO prepared statements sufficient to prevent SQL injection?使用PDO API保護SQL注入安全?

我和推出這一點我一直在努力了幾天一個新的API主要關注的是安全性。

我是PDO用法的初學者,但知道主要結構。但我不知道如何保護來自SQLInjection的查詢。

我的代碼列舉如下:

<?php 
    $Start = new Db(); 
    class Db 
    { 
     private $dbh = null; 

     public function __construct() 
     { 
      $this->dbh = new PDO('mysql:host=localhost;dbname=pdo', 'root', 'xxxxx'); 
     } 

     public function PDOFetch($Var) 
     { 
      $sth = $this->dbh->prepare("$Var"); 
      $sth->execute(); 
      $result = $sth->fetchAll(); 
      return $result; 
     } 

     public function PDONumb ($Var) 
     { 
      $sth = $this->dbh->prepare("$Var"); 
      $sth->execute(); 
      $count = $sth->rowCount(); 
      return $count; 
     } 

     public function PDODel ($Var) 
     { 
      $Delete = $this->dbh->exec("$Var"); 
      return $Delete; 
     } 

     public function PDOQuery ($Var) 
     { 
      $Query = $this->dbh->query("$Var"); 
      return $Query; 
     } 
    } 
?> 

我怎麼會去從SQL注入等漏洞保護?

編輯:

查詢被傳遞到API正在從例如「的index.php」頁面完成。

的線路是:

$Num = $Start->PDONumb("SELECT * FROM news"); 

可是後來,當我已經覆蓋了我的這個軌道。我想用更高級的方式使用它,所以它會傳遞用戶定義的變量(因此SQL注入問題)

但是目前,傳遞的查詢是由管理員定義的。

+1

對預防sql注入確實是爲什麼人們使用PDO的要點之一。它確實提供保護。你爲什麼認爲自己必須這樣做?如果您不會在執行時將錯誤的附加sql語句標記存儲在某處以合併這些標記,那麼PDO就足夠了。 – arkascha

+0

@arkascha我是新來的使用API​​,我習慣於需要手動輸入保護使用預定義函數的MySQL API。 那麼你說什麼,PDO保護它不是來自注射? –

+0

PDO不保護自己,如果使用「準備好的語句」,它會保護您的查詢。你首先準備一個帶有佔位符的聲明。您在執行期間將值綁定到這些佔位符。這就是所謂的「綁定」。檢查Andy Lesters答案如下。 – arkascha

回答

4

我們不能在沒有看到傳入的SQL的情況下進行分析。如果您使用不受信任的數據創建不安全的SQL語句,那麼它們是否在PDO中執行並不重要。您仍然可以開放SQL注入。

例如,如果你從網上$userid與您共建:

$sql = "SELECT * FROM users WHERE userid=$userid"; 

該SQL語句是開放的SQL注入,因爲如果$userid值爲0; DROP TABLE users;,那麼SQL您將創建意志是

SELECT * FROM users WHERE userid=0; DROP TABLE users; 

並且不管你是否通過PDO執行它:你仍在執行壞人向你發送的代碼。

要正確使用PDO,您需要bind your parameters


與您的問題無關,但新手經常遇到的一個重要問題是:沒有必要在您的單個變量中加雙引號。您的代碼

$Delete = $this->dbh->exec("$Var"); 

會更好寫成

$Delete = $this->dbh->exec($Var); 
+0

這絕對是真的。我甚至從來沒有想過有人可以這樣使用PDO。好的一點提到! – arkascha

+0

這就是OP的代碼所做的。在我看來,它只是從調用方獲取任意SQL代碼並執行它。 –

+0

我基本上生產這個,以儘量減少執行PDO查詢的整個過程,減少到1行,並將其傳遞到定義的函數。 查看我的帖子編輯 –