【问题标题】:REST Api can't read my requestREST Api 无法读取我的请求
【发布时间】:2018-03-12 03:37:14
【问题描述】:

我在我的框架中使用 slim,每当我在 Postman 上测试它时,php 无法读取参数,但是当我将其转换为 md5 时,php 现在可以读取请求。什么可能是我的问题。服务器向我发送空值。这是我的代码

DBOperations.php

    //Method for user login
function userLogin($userName, $userPassword)
{
    $password = md5($userPassword);
    $stmt = $this->con->prepare("SELECT userID FROM users WHERE userName = ? AND userPassword = ?");
    $stmt->bind_param("ss", $userName, $password);
    $stmt->execute();
    $stmt->store_result();
    return $stmt->num_rows > 0;
}

index.php

//user login route
$app->post('/login', function (Request $request, Response $response) {
if (isTheseParametersAvailable(array('userName', 'userPassword'))) {
    $requestData = $request->getParsedBody();
    $userName = $requestData['userName'];
    $userPassword = $requestData['userPassword'];
    $password = md5($userPassword);

    $db = new DbOperation();

    $responseData = array();

    if ($db->userLogin($userName, $userPassword)) {
        $responseData['error'] = false;
        $responseData['username'] = $db->getByUserName($userName);
    } else {
        $responseData['error'] = true;
        $responseData['message'] = $password;
    }

    $response->getBody()->write(json_encode($responseData));
}
});

当密码为md5时

{"error":true,"message":"d41d8cd98f00b204e9800998ecf8427e"}

没有密码时

{"error":true,"message":null}

【问题讨论】:

  • Don't use md5 for passwords d41d8cd98f00b204e9800998ecf8427e is md5 of null: 3v4l.org/OubSD,你也知道你的md5ing它两次,在控制器和模型中。
  • 首先你不应该在 WHERE 子句中使用密码,因为大多数时候 MySQL 是不区分大小写的(密码哈希应该是),你也应该使用经过批准的(密码学上安全的)比较函数来检查它.
  • @LawrenceCherone - 所以这意味着我根本没有得到任何价值?
  • 转出$requestData 以查看其中包含的内容。并启用错误报告。
  • $requestData 在我使用 var_dump 时包含 NULL。我看不出我在哪里没有得到任何价值。 @LawrenceCherone

标签: php rest


【解决方案1】:

你应该这样做

function userLogin($userName, $userPassword)
{

    $stmt = $this->con->prepare("SELECT userID, password FROM users WHERE userName = ?");
    $stmt->bind_param("s", $userName);
    $stmt->execute();
    $stmt->store_result();

    $stmt->bind_result( $userID , $password);
    $result = $stmt->fetch();


    if( password_verify($userPassword, $password)){
        return true;
    }
    return false;
}

我不使用 Mysqli,所以我希望这部分是正确的。

重要的是您不应该将密码用作 WHERE 子句的一部分。这有几个原因

  • 您依赖于获得结果,而不是根据输入数据检查结果。如果您的查询有问题,它可能会在不应该的情况下允许登录
  • 您没有使用专门设计的安全方法检查密码。

等等

你应该使用

password_hash

还有

password_verify

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2013-10-06
    • 2019-02-18
    • 2017-08-21
    • 2014-09-26
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多