2017-08-05 48 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();