使用用户输入获取带有预准备语句的表

时间:2018-02-17 07:23:54

标签: php mysql input pdo

我试图使用预准备语句,但它总是在第1行引发SQL语法错误。我的目标是尽可能保证安全。附加的代码有效。

GET值被格式化为字符串(例如:nmcxxwakfe)并且最初是动态生成的,因此无法仅允许特定值。

try {
$db = new PDO("mysql:dbname=somedb;host=localhost", "person", "mysupersecretpw" );

$db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );//Error Handling

$sql = "SELECT * FROM $value";
$result = $db->prepare($sql);
$result->execute();
$daten = $result->fetchAll();
} catch(PDOException $e) {
echo $e->getMessage();//Remove or change message in production code
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

为了安全起见,通过查看准备好的陈述,您绝对是目标。但是,代码段中唯一的变量是表名,这会产生问题:table names cannot be parameterized,至少在MySQL中。

那么,您如何验证传递的表是否有效?白名单。两种方法可能是:

  1. 硬编码脚本中的有效表列表:

    $validTableNames = ['somename', 'othertablename', 'stattable'];

  2. Dynamically get them from the DB

    $sql = "SELECT table_name FROM information_schema.tables where table_schema = '<your_database_name>'"
    $validTableNames = [];
    foreach ( $db->query( $sql ) as $row )
        $validTableNames[] = $row['table_name'];
    
  3. 然后,确认传递的输入是有效名称:

    if ( ! in_array($_GET['id'], $validTableNames) ) {
        // the passed table name is not valid.  Do what you will ...
    }