0

テーブルと列の名前は、PDO-> 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での編集もひどいので、それをより良くする方法を知っている場合は、先に進んで編集するか、私に知らせてください。

4

1 に答える 1

3

いいえ、安全ではありません。ユーザーが送信したデータをクエリ文字列に直接配置します。いつでも、SQLインジェクション攻撃に対して脆弱です。

ただし、これらの特定の値にプレースホルダーを使用することはできないためpdo::quote、たとえば、データを自分でエスケープする必要があります。

$safeType = $pdo->quote($_GET['type']);

テーブル名またはsort-by句の値であるからといって、それを挿入できないという意味ではありません。引用符で囲まれていない、エスケープされていない、またはプレースホルダーを介して挿入されていない文字列に入るユーザーデータは、攻撃ベクトルです。

于 2012-10-24T16:21:10.973 に答える