gpt4 book ai didi

php - 动态准备语句——这会打开安全漏洞吗?

转载 作者:行者123 更新时间:2023-11-29 00:43:12 26 4
gpt4 key购买 nike

这类似于这个问题 - Are Dynamic Prepared Statements Bad? (with php + mysqli) ,但是因为它已经 4 岁了,所以我想得到一个更新的答案。

我写了一个类,虽然我没有在更多的 copmlex sql 查询上测试它,但它在简单的 sql 查询上没有失败,但是我不确定这样做是否绕过了一个主要原因对于准备好的语句 - 安全性。

我已经使用了 call_user_func_array,这对于 bind_param 语句来说很容易,但是对于 bind_result 来说有点棘手。我最初使用 get_result 但是我使用的主机没有可用的 mysqlnd,但我设法绕过使用元数据。这是我写的完整类(class)。

你认为这安全吗?

传入的值是:

  • $sql是传入的sql语句:

    SELECT * FROM users WHERE id = ? AND created_timestamp > ?
  • $mysqli是mysqli连接

  • $para 是准备语句中的占位符:

    array ($types = 'ii', 23, 1235376000)

类(class):

class crudModel {
function ps($sql, $mysqli, $para) {
//this function should work for just about any simple mysql statement
//for more complicated stuff like joins, unions etc,. we will see
if ($prep = $mysqli->prepare($sql)) {
call_user_func_array(array($prep, 'bind_param'), $this->makeValuesRef($para, $mysqli));
$prep->execute();
$meta = $prep->result_metadata();
while ($field = $meta->fetch_field()) {
$parameters[] = &$row[$field->name];
}
call_user_func_array(array($prep, 'bind_result'), $parameters);
while ($prep->fetch()) {
foreach ($row as $key=>$val) {
$x[$key] = $val;
}
$data[] = $x;
}
return $data;
}
}

function makeValuesRef($array, $mysqli) {
$refs = array();
foreach($array as $key => $value) {
$array[$key] = $mysqli->real_escape_string($value); //i don't think escaping is necessary, but it can't hurt (??)
$refs[$key] = &$array[$key];
}
return $refs;
}
}

最佳答案

您在这里所做的不是动态准备语句。您只是在 MySQLi API 之上添加了一些语法糖(这很糟糕)。

简而言之,您在此处显示的代码实际上不存在任何安全问题。事实上,这种做法非常好,因为它可以让您以后更轻松地验证您是否正确执行此操作(因为 MySQLi API 很糟糕)。

所以你很好。我会担心您生成查询的区域,并确保您不会在没有白名单的情况下不小心将用户数据放入其中...

关于php - 动态准备语句——这会打开安全漏洞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340021/

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