2015-12-06 67 views
1

現在我有一個網站,我需要從基本的SQL注入攻擊安全。該網站是非常基本的,只是一個登錄表單和產品搜索頁面。現在我有一個文件,我在網站上保留了我所有的功能。下面是幾個例子他們看起來像:創建參數來停止sql注入

function createUser($userName,$userPass){ 
$query = <<<STR 
INSERT INTO Users (userName,userPass,userTypeID) 
VALUES ('$userName','$userPass',2) 
STR; 
return executeQuery($query); 
} 

或者

function getProductByName($productName){ 
$query = <<<STR 
SELECT productID,productName, productPic,productDesc 
FROM Products 
WHERE productName LIKE '%$productName%' 
STR; 


return executeQuery($query); 
} 

我要改變這些,讓他們充分利用準備好的發言的,但我無法理解如何,我可以將它們轉換。我發現的例子是利用bindParam的像這樣的:

$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City) 
VALUES (:nam, :add, :cit)"); 
$stmt->bindParam(':nam', $txtNam); 
$stmt->bindParam(':add', $txtAdd) 
$stmt->bindParam(':cit', $txtCit); 
$stmt->execute(); 

我可以將bindparam到我的功能不知何故?任何線索都會很棒。

回答

1

將它們轉換,只是做了prepare()bindParam()部分在顯示功能,並在executeQuery()功能​​這樣

function createUser($userName,$userPass,$dbh) { 
    $stmt = $dbh->prepare("INSERT INTO Users (userName, userPass, userTypeID) VALUES (:name, :pass, :id)"); 
    $stmt->bindParam(':name', $userName); 
    //etc 
    return executeQuery($stmt); 
} 

function executeQuery($stmt) { 
    $stmt->execute(); 
} 

如果你不想注入$dbh,您可以使用global $dbh;或函數中的類似方法(並且不必更改您現有的代碼庫)。

但是,當然這將是非常重複的,因爲您需要編寫多個bindParam()語句。更簡單的方式,假設你使用的PDO,將是一個數組傳遞給​​(as shown in the manual

function createUser($userName,$userPass,$dbh) { 
    $stmt = $dbh->prepare("INSERT INTO Users (userName, userPass, userTypeID) VALUES (:name, :pass, :id)"); 
    $params = array(
     ':name' => $userName, 
     //etc 
    ); 
    return executeQuery($stmt, $params); 
} 

function executeQuery($stmt, $params) { 
    $stmt->execute($params); 
} 

要詳細一點:的bindParam()真正的力量來當你)要使用的$data_type$length參數(What are those?)或b)當您使用多個​​語句,例如批量插入

$stmt = $dbh->prepare("INSERT INTO users (name) VALUES (:name)"); 
$stmt->bindParam(":name", $name); 
for (...) { 
    $name = ... 
    $stmt->execute(); 
} 
+0

感謝您的信息。這可能是一個愚蠢的問題,但有一件事我很困惑的是這裏這一行: '$ stmt = $ dbh-> prepare(「INSERT INTO users(name)VALUES(:name)」);' 什麼是$ dbh在做什麼?這是否應該在其他地方宣佈?這是數據庫連接嗎?我看到有些人在線聲明爲 ''??php $ dbh = new PDO('mysql:host = localhost; dbname = test',$ user,$ pass); ?>' 是這樣嗎? – SheepCity

+0

@SheepCity它是「db處理程序」,因此它保存關於連接的信息,正確。你發佈的代碼看起來是正確的,欲瞭解更多信息,請閱讀[官方手冊](http://php.net/pdo)。爲什麼這是必要的?你可能有多個數據庫,所以你可以區分它們。以前PHP假設,現在你需要明確地告訴它 – kero