我试图使用预准备语句,但它总是在第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
}
感谢您的帮助!
答案 0 :(得分:0)
为了安全起见,通过查看准备好的陈述,您绝对是目标。但是,代码段中唯一的变量是表名,这会产生问题:table names cannot be parameterized,至少在MySQL中。
那么,您如何验证传递的表是否有效?白名单。两种方法可能是:
硬编码脚本中的有效表列表:
$validTableNames = ['somename', 'othertablename', 'stattable'];
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'];
然后,确认传递的输入是有效名称:
if ( ! in_array($_GET['id'], $validTableNames) ) {
// the passed table name is not valid. Do what you will ...
}