gpt4 book ai didi

php - 这是关于安全性和 MySQL 的良好做法吗?

转载 作者:行者123 更新时间:2023-11-29 01:27:06 24 4
gpt4 key购买 nike

我只想对网站的一些 php 代码提供一些反馈,因为这是我第一次编写可以在公共(public)网站上正确使用的代码,而且我有点偏执。

此代码位于注册页面的顶部,其中包含一个发送回自身的 post 表单,因此我通过检查 POST 是否为“isset”来检查表单是否已完成。

这是一个注册页面:

<?php
if (isset($_POST['email'])) {

$thanks = '';

$name = $_POST['name'];
$email = $_POST['email'];
$postcode = $_POST['postcode']; //not used
$password = $_POST['password'];


//connects to database, DB variable is dbConnection
require_once("include/database_connect_test.php");

//First check email isn't already on DB
$sql = 'SELECT * FROM `user_profile` WHERE email=?';

$stmt = $dbConnection->prepare($sql);
$stmt->bind_param('s', $email);
$stmt->execute();
$stmt->store_result();


$num_of_rows = $stmt->num_rows;
$stmt->close();

if($num_of_rows>0)
$thanks = 'This email has already been registered';

//If not, create profile
else{

require_once('generate_uuid.php');

$hash = password_hash($password, PASSWORD_BCRYPT); //password_verify(pass, hash) to verify



$sql = 'INSERT INTO `user_profile`(`name`, `email`, `hash`, `uuid`) VALUES (?,?,?,?)';

$stmt = $dbConnection->prepare($sql);
$stmt->bind_param('ssss', $name, $email, $hash, $uuid);

$stmt->execute();

$stmt->close();


$thanks = 'Thank you for signing up!'; //used in the html
}
}?>

提前感谢您的任何输入:)

最佳答案

从安全的角度来看,我没有发现任何特别的错误。您正在正确地做最重要的事情:

  • 使用当前支持的 MySQL 扩展
  • 使用准备好的语句
  • 使用 password_hash() 散列密码

挑剔:

  • $_POST['email'] 已设置的事实并不意味着其他发布变量也将存在。您确实应该验证所有 输入,因为填写表单并不是向脚本提交数据的唯一方式。但是,安全 是一种确保您可以通过避免误报来利用 PHP 通知的方法。

    此外,您可能会喜欢过滤器扩展,这是一个已经可用了一段时间但并不是特别普遍的功能,它允许这样的代码:

    $name = filter_input(INPUT_POST, 'name');
    $email = filter_input(INPUT_POST, 'email');
    $postcode = filter_input(INPUT_POST, 'postcode'); //not used
    $password = filter_input(INPUT_POST, 'password');
  • 我从来不喜欢计算结果集中的行数来验证用户是否存在的技术,因为它过于依赖外部因素(数据库驱动程序、使用的查询函数...)。我只是获取行,这还允许为 session 变量检索额外的用户数据。

  • 我想 $uuid 是在 generate_uuid.php 中定义的,但是当您查看代码时,它似乎不知从哪里冒出来。更好的结构是您包含的文件加载函数,然后调用这些函数:

    $uuid = generate_uuid();
    $stmt->bind_param('ssss', $name, $email, $hash, $uuid);

...但是,正如我所说,这些因素都不会影响安全。

关于php - 这是关于安全性和 MySQL 的良好做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38142625/

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