gpt4 book ai didi

php - 如何在 php 中使用 Postgresql 的白名单和准备好的语句?

转载 作者:行者123 更新时间:2023-11-29 12:10:34 24 4
gpt4 key购买 nike

我知道我需要在我的 php 代码中实现白名单和准备好的语句。但是我不确定如何使用 Postgresql 执行此操作,我的代码真的有必要吗?我正在使用选择列表将用户选择的值传递给查询。

<?php

include "connect.php";

$table = $_POST['tableSelected'];
$field = $_POST['fieldSelected'];
$attribute = $_POST['attributeSelected'];
$operator = $_POST['operatorSelected'];
$fieldList = $_POST['fieldList'];

$fieldstr = $fieldList . ",ST_AsGeoJSON(ST_Transform(l.geom,4326))";


$sql = "SELECT $fieldstr
FROM $table l";

if (!empty($field) && !empty($operator) && !empty($attribute)) {
$sql .= " WHERE {$field} {$operator} '{$attribute}'";
}

echo ($sql);

?>

最佳答案

白名单

您当前形式的代码非常危险,您不仅允许用户决定应选择哪些字段,还允许他决定查询哪些表。你一定要对这些进行白名单检查。例如:

if($_POST['tableSelected'] == 'acceptable_table1' || $_POST['tableSelected'] == 'acceptable_table2) {
$table = $_POST['tableSelected']
}

同样,您应该验证字段列表。但是字段列表验证将变得相当复杂,因为您的字段将依赖于表。我建议创建数组并检查选择内容是否在其中。

$table1_fields = array('col1','col2',...)
$table2_fields = array('col1','col2',...)

准备好的语句

如您所知,预处理语句只能用于绑定(bind)参数。它们不能用于填写表名和列名。这就是为什么您需要准备好的语句和白名单。我建议使用 PDO .它可能看起来像

$stmt = $dbh->prepare("SELECT {$fieldlist} FROM {$table} where field = ?");
$stmt->execute(array('somevalue'));

关于php - 如何在 php 中使用 Postgresql 的白名单和准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37920413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com