Я пытался использовать подготовленные заявления, но он всегда бросает мне синтаксическую ошибку SQL в строке 1. Моя цель - сделать это максимально безопасным. Приложенный код работает.
Значение 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
}
Спасибо за помощь!
Для обеспечения безопасности вы абсолютно на виду, глядя на подготовленные заявления. Однако единственной переменной в вашем фрагменте кода является имя таблицы, и это создает проблему: имена таблиц не могут быть параметризованы, по крайней мере, в MySQL.
Итак, как бы вы подтвердили правильность принятой таблицы? Белый список. Возможны два подхода:
Жесткий код: список допустимых таблиц в вашем скрипте:
$validTableNames = ['somename', 'othertablename', 'stattable'];
Динамически получить их из БД:
$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 ...
}
$value
? Если это несуществующая переменная или пустая, то вы отправляете DBSELECT * FROM
, что действительно синтаксически неверно. Посмотрите, что содержит$sql
(например, сecho
) перед отправкой в$db->prepare()
.