题
我需要完成以下身份验证脚本。我在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