我需要完成以下身份验证脚本。我在php / pdo上很弱,所以我不知道如何要求等于一行的行数,然后从查询结果中设置会话ID。我不仅需要设置$ _SESSION ['userid'],还要设置['company']和['security_id']以及结果。

这就是我所拥有的:

$userid   = 

我需要完成以下身份验证脚本。我在php / pdo上很弱,所以我不知道如何要求等于一行的行数,然后从查询结果中设置会话ID。我不仅需要设置$ _SESSION ['userid'],还要设置['company']和['security_id']以及结果。

这就是我所拥有的:

<*>

可选信息: 浏览器:Firefox

POST['userid']; $password =

我需要完成以下身份验证脚本。我在php / pdo上很弱,所以我不知道如何要求等于一行的行数,然后从查询结果中设置会话ID。我不仅需要设置$ _SESSION ['userid'],还要设置['company']和['security_id']以及结果。

这就是我所拥有的:

<*>

可选信息: 浏览器:Firefox

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"; }

可选信息: 浏览器:Firefox

有帮助吗?

解决方案

不要使用该代码!

你有一个非常严肃的SQL注入。您在SQL语句中使用的每个用户输入,无论是来自cookie还是CGI,还是 必须消毒。我可以通过尝试使用如下用户名登录来轻松进入该系统:

user'; UPDATE contractors SET password = '1337'

...之后我可以像任何人一样登录。对不起,如果我听起来很咄咄逼人,但该代码所做的就是忘记将前门锁在公司里,甚至可能都没有报警系统。

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

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

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

至于其他问题,我不知道你对SQL SELECT的方法是否是最好的方法。我只需选择相应用户的密码并尝试在程序中进行匹配。我不认为你使用的方法有任何错误,但它似乎不合逻辑,因此错过了一些错误的可能性更大 - 如果是密码和登录会为漏洞利用创建一个窗口。

要按照自己的方式进行操作,您需要注意从 PDO 中获得的结果 query PDOStatement ,似乎没有可靠的功能来直接计算金额结果行。您需要使用的是 fetchAll ,它返回行数组,并计算。但是,正如我所说,所有人都觉得它对失败是开放的,所以我觉得在代码中检查密码会更安全。在这样一个安全关键的地方,与我的口味实际密码匹配的距离太远了。

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

以下是修复方法:

$userid_dirty   = 

不要使用该代码!

你有一个非常严肃的SQL注入。您在SQL语句中使用的每个用户输入,无论是来自cookie还是CGI,还是 必须消毒。我可以通过尝试使用如下用户名登录来轻松进入该系统:

user'; UPDATE contractors SET password = '1337'

...之后我可以像任何人一样登录。对不起,如果我听起来很咄咄逼人,但该代码所做的就是忘记将前门锁在公司里,甚至可能都没有报警系统。

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

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

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

至于其他问题,我不知道你对SQL SELECT的方法是否是最好的方法。我只需选择相应用户的密码并尝试在程序中进行匹配。我不认为你使用的方法有任何错误,但它似乎不合逻辑,因此错过了一些错误的可能性更大 - 如果是密码和登录会为漏洞利用创建一个窗口。

要按照自己的方式进行操作,您需要注意从 PDO 中获得的结果 query PDOStatement ,似乎没有可靠的功能来直接计算金额结果行。您需要使用的是 fetchAll ,它返回行数组,并计算。但是,正如我所说,所有人都觉得它对失败是开放的,所以我觉得在代码中检查密码会更安全。在这样一个安全关键的地方,与我的口味实际密码匹配的距离太远了。

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

以下是修复方法:

<*>

当然,代码可以稍微清理一下,但这应该解释需要做什么。请注意,由于密码都是哈希值,而从未在SQL 中使用,因此实际上并不需要清理。但是为了以防万一,我把它留在那里,因为在原始代码中,查询中使用了

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

另外,我提供了cPOST['userid']; $password_dirty =

不要使用该代码!

你有一个非常严肃的SQL注入。您在SQL语句中使用的每个用户输入,无论是来自cookie还是CGI,还是 必须消毒。我可以通过尝试使用如下用户名登录来轻松进入该系统:

user'; UPDATE contractors SET password = '1337'

...之后我可以像任何人一样登录。对不起,如果我听起来很咄咄逼人,但该代码所做的就是忘记将前门锁在公司里,甚至可能都没有报警系统。

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

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

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

至于其他问题,我不知道你对SQL SELECT的方法是否是最好的方法。我只需选择相应用户的密码并尝试在程序中进行匹配。我不认为你使用的方法有任何错误,但它似乎不合逻辑,因此错过了一些错误的可能性更大 - 如果是密码和登录会为漏洞利用创建一个窗口。

要按照自己的方式进行操作,您需要注意从 PDO 中获得的结果 query PDOStatement ,似乎没有可靠的功能来直接计算金额结果行。您需要使用的是 fetchAll ,它返回行数组,并计算。但是,正如我所说,所有人都觉得它对失败是开放的,所以我觉得在代码中检查密码会更安全。在这样一个安全关键的地方,与我的口味实际密码匹配的距离太远了。

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

以下是修复方法:

<*>

当然,代码可以稍微清理一下,但这应该解释需要做什么。请注意,由于密码都是哈希值,而从未在SQL 中使用,因此实际上并不需要清理。但是为了以防万一,我把它留在那里,因为在原始代码中,查询中使用了

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

另外,我提供了cPOST['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 是一个非常好的主意在哈希之前。

另外,我提供了c

其他提示

php手册是学习PHP的绝佳资源。看起来你知道一点SQL,你听说过PDO,这是一个好的开始。如果您在谷歌搜索“PDO”,或查看该术语的PHP手册,您将找到 PDO手册的第节。您好像找到了 - &gt;查询函数,所以现在需要查看返回的内容。转到该功能的手册页,我们看到它返回一个 PDOStatement 对象。单词 PDOStatement 有助于链接到手册中的相关页面,其中列出了该对象上可用的方法。有一个 rowCount()方法可能会做你想要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top