表和列名称不能使用PDO绑定 - > gt; bindParam(),但我相信不止一个人会喜欢。这有点晚了,但我之前写过这篇文章,到目前为止它还有效。我是一个新的PHP,想知道你的想法,如果它是安全的。
$type = "defaultTableName";
$sortBy = "defaultColumnName";
$orderBy = "ASC";
//whitelisting unsafe input
if(isset($_GET['orderBy'])&&($_GET['orderBy']=="ASC"||$_GET['orderBy']=="DESC"))
$orderBy = $_GET['orderBy'];
$tableNames = array("defaultTableName", "tableName2", "tableName3");
$unsafeType= $_GET['type']; <---unsafe input
$unsafeSortBy = $_GET['sortBy']; <---unsafe input
try {
$pdo = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//if input is not valid this will use default table to render a table in html.
$stmt = $pdo->prepare("DESCRIBE $type");
$stmt->execute();
$table_fields = $stmt->fetchAll(PDO::FETCH_COLUMN);
//Whitelisting user input against table names (will require table names updates)
if (in_array($unsafeType, $tableNames)) {
$stmt = $pdo->prepare("DESCRIBE $unsafeType");
$stmt->execute();
$table_fields = $stmt->fetchAll(PDO::FETCH_COLUMN);
///Whitelisting the column name to sort by against the description of the table.
if (in_array($unsafeSortBy, $table_fields)) {
$stmt = $pdo->prepare("SELECT * FROM $unsafeType ORDER BY $unsafeSortBy $orderBy");
}
else {
$stmt = $pdo->prepare("SELECT * FROM $type ORDER BY $sortBy $orderBy");
}
} else {
$stmt = $pdo->prepare("SELECT * FROM $type ORDER BY $sortBy $orderBy");
}
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
我看到的唯一问题是,在更改表时需要添加/删除/更改表名数组。我有一个小/中型应用程序,而不是非常复杂。
注意:我在stackoverflow中编辑也很糟糕,所以如果你知道一种更好的方法,那就继续编辑或让我知道。
答案 0 :(得分:3)
没有。这不安全。您将直接将用户提交的数据放入查询字符串中。 ANYTIME 你做的就是你很容易受到SQL注入攻击。
但是,由于您不能对这些特定值使用占位符,因此您必须使用pdo::quote
自行转义数据,例如
$safeType = $pdo->quote($_GET['type']);
只是因为它是表名或sort-by子句值并不意味着它不能被注入。进入未通过占位符引用/转义或插入的字符串的任何用户数据都是攻击媒介。