gpt4 book ai didi

php认证脚本

转载 作者:行者123 更新时间:2023-12-01 00:33:55 25 4
gpt4 key购买 nike

我需要完成以下身份验证脚本。我不擅长 php/pdo,所以我不知道如何要求行数等于 1,然后根据查询结果设置 session ID。我不仅需要设置 $_SESSION['userid'],还需要根据结果设置 ['company'] 和 ['security_id']。

这是我的:

$userid   = $_POST['userid'];
$password = $_POST['pass'];
if ( $userid != "" || $password != "" )
{
$sql = "SELECT * FROM contractors WHERE userid = '" . $userid . "' AND password = '" . $password . "'";
$result = $dbh->query( $sql );
} else
{
echo "login failed. Your fingers are too big";
}

可选信息:浏览器:火狐

最佳答案

永远不要使用该代码!

您在那里打开了一个非常严重的 SQL 注入(inject)。您获取的每个用户输入,无论是来自 cookie 或 CGI,还是任何地方,在用于 SQL 语句之前,都必须过滤。我可以通过尝试使用以下用户名登录来轻松闯入该系统:

user'; UPDATE contractors SET password = '1337'

...之后我可以以任何人身份登录。对不起,如果我听起来很咄咄逼人,但该代码的作用就像忘记锁上您公司的前门,而您的公司甚至可能没有警报系统。

请注意,输入是否真的来自用户并不重要(可能是预填充的,隐藏的)。从安全的角度来看,任何来自之外的任何地方都被视为包含用户的恶意输入。

据我所知,您需要使用 quote PDO 的功能以正确清理字符串。 (在 mysql 中,这将通过 mysql_real_escape_string() 完成。)我不是 PDO 方面的专家,请注意,如果我在这里错了,请有人纠正。

此外,您可能不应该将任何密码直接存储在数据库中,而是使用散列函数创建一个掩码密码,然后还根据用户提供的密码创建散列,并匹配散列。您可以使用 PHP hash 函数来执行此操作。

至于其他问题,我不知道你在SQL SELECT上的做法是不是最好的做法。我只会选择相应的用户密码并尝试在程序中匹配它。我不认为你使用的方法有任何错误,但它看起来不合逻辑,因此更有可能遗漏一些错误 - 如果密码和登录名会为攻击创建一个窗口。

按照您的方式进行操作,您需要注意从 PDO 获得的结果queryPDOStatement ,似乎没有可靠的功能来直接计算结果行的数量。你需要使用的是fetchAll它返回一个行数组,并对其进行计数。然而,正如我所说,这一切对我来说就像是对失败敞开大门,所以我会更安全地检查代码中的密码。在这样一个对安全至关重要的地方,就我的口味而言,与实际的密码匹配同情相去甚远。

因此,要获得用户 ID 的结果密码,您可以使用 PDOStatement 的 fetch()它从结果中返回列的内容。例如,使用 PDO::FETCH_ASSOC 将它们放入基于列名的关联数组中。

修复方法如下:

$userid_dirty   = $_POST['userid'];
$password_dirty = $_POST['pass'];
$success = false; // This is to make it more clear what the result is at the end
if ($userid != "" || $password != "") {
$userid = $dbh->quote($userid_dirty);
$passwordhash = hash('sha256',$password_dirty);
$sql = "SELECT userid, passwordhash, company, security_id FROM contractors WHERE userid = ".$userid;
$result = $dbh->query( $sql );
if ($result) { // Check if result not empty, that userid exists
$result_array = $result->fetch(PDO::FETCH_ASSOC);
if ($result_array['PASSWORDHASH'] == $passwordhash) {
// login success
$success = true;

// do all the login stuff here...
// such as saving $result_array['USERID'], $result_array['COMPANY'], $result_array['SECURITY_ID'] etc.

} // else fail, wrong password
} // else fail, no such user
} else {
// fail, userid or password missing
echo ' please enter user id and password.';
}
if (!$success) {
echo ' login failed.';
}

当然,代码可以稍微清理一下,但这应该能说明需要做什么。请注意,由于密码都是散列的,并且从未在 SQL 中使用过,因此实际上不需要清理。但我把它留在那里以防万一,因为在原始代码中它用于查询。

请注意,所有有关存储密码的代码都需要更改为存储哈希而不是密码。此外,使用 salt 是个好主意。在散列之前添加到密码中。

此外,我只是出于教育目的提供代码 - 我只是认为代码是解释如何执行此操作的最清晰的方式。所以不要把这个网站误认为是请求代码的服务。 :)

关于php认证脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401454/

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