gpt4 book ai didi

php - 使用 mysqli 准备 Opencart 登录自定义 api

转载 作者:行者123 更新时间:2023-11-29 02:45:50 37 4
gpt4 key购买 nike

我正在使用 mysqli prepare 等制作一些登录 api 函数。

open cart 使用的正确登录函数如下

$customer_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "customer WHERE LOWER(email) = '" . $this->db->escape(utf8_strtolower($email)) . "' AND (password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))) OR password = '" . $this->db->escape(md5($password)) . "') AND status = '1' AND approved = '1'");

我正在尝试使用以下代码使用 mysqli prepare 语句来实现它。

$result = mysqli_prepare($db, "SELECT customer_id, firstname, lastname, email, telephone, fax, address_id, customer_group_id FROM `oa_customer` WHERE LOWER(email) = ? AND password = ? OR password = ? ;");

$md5pass = md5($password);
$newpass = "SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $password . "'))))"
echo "md5 ";
print_r($md5pass);
echo "new ";
print_r($newpass);
mysqli_stmt_bind_param($result, 'sss', utf8_strtolower($email), $password, $md5pass);
mysqli_stmt_execute($result);
mysqli_stmt_bind_result($result, $customerid, $firstname, $lastname, $email, $telephone, $fax, $address_id, $coustomer_group_id);

while(mysqli_stmt_fetch($result))
{
$id = $customerid;
$name = $firstname;
$surname = $lastname;
$email = $email;
$phone = $telephone;
$fax = $fax;
$addressid = $address_id;
$customergroup = $customer_group_id;

}
mysqli_stmt_close($result);
mysqli_close($db);

我唯一的问题是这一行

$newpass = "SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $password . "'))))"

它试图表示第一个原始登录查询的以下代码

(password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "')))))

当我尝试这个时,我收到请求错误 500。

第二次尝试如下。

而不是使用

$newpass = "SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1('" . $this->db->escape($password) . "'))))"

我把它换成了

$newpass = sha1($salt . sha1($salt . sha1($password)));

又是 500 错误。知道我应该在我的 mysqli prepare 中做什么,以便它可以与原始查询相同吗?

谢谢!

最佳答案

可能像这样的东西应该起作用:

$db = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$result = mysqli_prepare($db, "
SELECT customer_id, firstname, lastname, email, telephone, fax, address_id, customer_group_id
FROM `" . DB_PREFIX . "customer`
WHERE LOWER(email) = ?
AND password = SHA1(CONCAT(salt, SHA1(CONCAT(salt, SHA1(?)))))
");
mysqli_stmt_bind_param($result, 'ss', $email, $password);
mysqli_stmt_execute($result);
mysqli_stmt_bind_result($result, $customer_id, $firstname, $lastname, $email, $telephone, $fax, $address_id, $customer_group_id);

while(mysqli_stmt_fetch($result)) {
$id = $customer_id;
$name = $firstname;
$surname = $lastname;
$email = $email;
$phone = $telephone;
$fax = $fax;
$addressid = $address_id;
$customergroup = $customer_group_id;
}
mysqli_stmt_close($result);
mysqli_close($db);

原始查询中的 md5 选项严格用于支持遗留数据,Opencart 不再使用它来存储密码,因此除非您处理的是十年前的表,否则您可以取消完全与那部分。还要注意,你真的不需要转义密码,因为一阶 sql 注入(inject)已经由准备好的语句处理,所以只将原始 $password 参数传递给语句应该是安全的。

另外如评论中所述,已经有类方法可以获取您似乎想要的数据。例如,一旦客户登录,您可以调用任何 Controller :

$lastname = $this->customer->getLastName();
$fax = $this->customer->getFax();

因此,如果您的所有后续操作都是访问类属性,那么知道已经有相关方法可能会有所帮助。

关于php - 使用 mysqli 准备 Opencart 登录自定义 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42333300/

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