使用PHP变量自定义SQL语句?

时间:2012-06-22 16:47:23

标签: php mysql sql

我正在编写一个函数,如果它已经存在,它将删除一个表。它将询问用户他们想要调用表的内容,获取该响应并将其放入php变量中。我想为sql创建一个自定义的drop语句,以便sql没有错误。这就是我所拥有的。

$table = $_POST["tablename"];      //gets table name from html page

drop_table($db, $table);           //call function

function drop_table($db,$table){            
    $drop = "DROP TABLE IF EXISTS .$table. ";     //this is the part I can't figure out. How do I add in the table name to the statement, 
    $q = mysqli_query($db, $drop); //since the sql statement has to be in quotes?
} 

谢谢!

P.Ss这是一个仅用于分析的内部系统。如果只是我的同事和我正在使用它,不用担心掉桌

2 个答案:

答案 0 :(得分:4)

这里的问题是尝试在$table中用点连接时出现语法错误。删除那些。

$drop = "DROP TABLE IF EXISTS $table ";  

但是更大的问题是你允许最终用户删除数据库中的任何表,因为你没有以任何方式过滤输入。

您需要确保您的用户只删除当前所选数据库中的表格,这至少意味着. $table$table = 'information_schema.user'不会阻止if (strpos($table, '.') !== FALSE) { // don't allow the action! } 之类的内容

$table

要采取的另一个步骤是在执行information_schema.TABLES语句之前验证DROP// If this returns 1, the table exists in the correct database and can be dropped. // note that $table is escaped here. I didn't fill in the mysqli_query() but obviously // this is to be executed. It would be even better with a MySQLi prepared statement "SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA='the_allowed_database' AND TABLE_NAME='" . mysqli_real_escape_string($db, $table) . "'"` 的值是否存在并且属于正确的当前数据库。

usertable_

通过此检查后,您最好为表格指定一个前缀,这些表格在环境中是灵活的,因此允许删除,因此用户无法删除活动中的每个表数据库。例如,只允许删除前缀为if (strpos($table, 'usertable_') !== 0) { // don't permit deletion } 的表。

{{1}}

这是一个非常难以保护的设计,我建议您退后一步,重新考虑这里的策略。在允许用户根据表单输入删除表时,您需要非常小心。

答案 1 :(得分:3)

你的意思是:

$drop = "DROP TABLE IF EXISTS " . $table;

我真的,非常希望您能够通过在网址中输入正确的名称来考虑某人能够从您的数据库中删除表格的后果。