如何清理查询以接受表名作为参数PDO PHP

时间:2018-11-17 15:12:56

标签: php mysql pdo

我有以下有效的代码,但是,我现在想知道这是否安全,而不是sql可注入等。

我无法像对Web应用程序那样将表名列入白名单,将来会随机生成更多表,并将通过table的URL参数进行传递,因此我永远都不会知道所有桌子。

我使用第一个查询来确定通过URL参数传递的表是否确实存在,否则我将退出要添加的脚本。

$db = "database1";
$table = $_GET['table'];
$stmt = $auth_table->runQuery("Select table_name, table_schema from information_schema.tables where table_schema = :db and table_name = :tablename");
$stmt->execute(array(":db"=>$db,":tablename"=>$table));
$tableRow=$stmt->fetch(PDO::FETCH_ASSOC);
$table_schema = $tableRow['table_schema'].".".$tableRow['table_name'];

$stmt = $auth_table->runQuery("Select * from ".$table_schema."");
$stmt->execute();
$testing=$stmt->fetch(PDO::FETCH_ASSOC);
print_r($testing['level']);
exit();

1 个答案:

答案 0 :(得分:2)

将现有表列入白名单

$db = "database1";
$table = $_GET['table'];

$dbh = new PDO('mysql:host=localhost;dbname=database1', $user, $pass);
$tableSql = "SHOW TABLES FROM " . $db;       
$tableRes = $dbh->query($tableSQL); 
$tableArr  = $tableRes->fetch(PDO::FETCH_ASSOC);
$whitelist = $tableArr[0]['Tables_in_database1']; 
if(!in_array($table, $whitelist)){
    exit(); //Or RickRoll Them
}