2017-08-05 47 views
-1

此代碼可以工作並將表添加到我的數據庫中。我的問題是如何用預先準備好的陳述來保護它。向MySQL添加表的準備語句(PHP)

require "conn.php"; 
    $MyServer =($_POST["username"]); 
     $sql = ("CREATE TABLE $MyServer (
      id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
      username VARCHAR(30) NOT NULL 
      )"); 
     if($conn->query($sql) === TRUE){ 
      echo "Table created successfully"; 
     } 

我正在使用MySQLi。 我嘗試了這一點,它不添加表。

$MyServer =($_POST["username"]); 
    if (!preg_match('^/[A-Za-z][A-Za-z0-9]{0,7}$/', $MyServer)) { 
     throw new Exception ('username unsuitable for use as a table name'); 
    } 
    $sql = ("CREATE TABLE `$MyServer` (
     id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
     username VARCHAR(30) NOT NULL 
     )"); 
    if($conn->query($sql) === TRUE){ 
     echo "Table created successfully"; 
    } else { 
     echo "Table is not created successfully "; 
    } 
+0

保護的是什麼?你想保護的是什麼?你的意思是你如何避免SQL注入和所有 – Jok3r

+2

您允許用戶根據'$ POST'變量來創建表?可能不是最好的計劃。您至少需要清理/清理表名。 –

+0

我要保護它免受注射 –

回答

1

我想你正在考慮如何通過你的示例程序中的$MyServer變量來避免SQL注入到你的查詢中。

您不能使用參數化的值來爲SQL中的表(或數據庫或列)命名。您必須執行程序中顯示的變量替換。

雖然你可以使用php來清理你的$MyServer變量,然後用它來替換。

例如:How to check, if a php string contains only english letters and digits?

你能做到這一點,或者類似的東西。這需要變量以字母開頭,然後再包含多達七個字母或數字的字符。如果變量不匹配,則拋出異常。

if (!preg_match('^/[A-Za-z][A-Za-z0-9]{0,7}$/', $MyServer)) { 
    throw new Exception ('username unsuitable for use as a table name'); 
} 
0

雖然它是值得懷疑它是否是一個很好的計劃,以允許用戶創建表,回答你的問題:

首先,確保你的變量不包含任何性格怪異。儘管MySQL allows (a subset of) unicode characters,你可能只需要正常的字母和數字:

if (
    !preg_match('/^[a-z0-9]+$/i', $MyServer) 
    || preg_match(/^[0-9]+$/, $MyServer) // Identifiers may begin with a digit but unless quoted may not consist solely of digits. 
    || strlen($MyServer) > 64 // Limit of table-name length 
) { 
    // Insert your own error handling 
    die('Not allowed'); 
} 

其次,以確保SQL把它當作一個標識符,引號,在反引號

$sql = "CREATE TABLE `$MyServer` (...etc..." 

CREATE TABLE index (...etc...將提高在MySQL錯誤因爲index是一個關鍵字

CREATE TABLE `index` (...etc... 

不會,因爲它被標記爲一個標識符。

0

老實說,你是不是真正的從$_POST獲取數據打開自己高達SQL注入這裏。

除非您的用戶名已存儲在您的數據庫中,並且沒有會導致SQL注入的特殊字符(例如引號),否則您的方法肯定不行。

編輯:我看到上面的兩個答案讚揚我說的,你可以使用這兩個答案之一(O.瓊斯是我的首選)。

如果你想你的代碼與PDO過程(結合PDO值,以避免SQL注入)線多一點,爲什麼不創建一個列(用戶名,saved_username)一個表,你可以在該信息交互有效地使用PDO語句。

例如,所有你需要做的插入數據是:

$query = 'INSERT INTO table (username, saved_username) VALUES (:username, :username_to_save)'; 
$stmt->bindParam(':username', $_POST['username']); 
$stmt->bindParam(':username_to_save', $_POST['username_to_save']); 
$stmt->execute() 

,並選擇數據:

$query = 'SELECT * FROM table WHERE username = :username'; 
$stmt->bindParam(':username', $_POST['username']); 
$stmt->execute() 
$users_saved_usernames = $stmt->fetchAll();