- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要完成以下身份验证脚本。我不擅长 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 获得的结果query
是 PDOStatement
,似乎没有可靠的功能来直接计算结果行的数量。你需要使用的是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/
我正在使用 Tornado 与 twitter 等第三方进行身份验证。 我的登录处理程序看起来像这样 class AuthLoginHandler(BaseHandler, tornado.auth.
有没有一种真正的方法可以在 Pylons 中添加身份验证?我见过很多不同的方法,但大多数方法要么过时,要么过于复杂。是否有教程可以解释如何以良好而可靠的方式添加身份验证? 最佳答案 考虑使用 repo
RESTful 身份验证是什么意思,它是如何工作的?我在谷歌上找不到很好的概述。我唯一的理解是您在 URL 中传递了 session key (记住),但这可能是非常错误的。 最佳答案 如何在 RES
我正在考虑在基于插件的系统中实现安全性的多种方式。现在,当我说“安全”时,我的意思是: a) 插件系统的开发人员如何确保插件在核心平台上的使用是安全的。b) 插件开发人员如何确保在其平台上使用的插件是
我正在使用 WCF Webhttp 服务。我创建了一堆服务,剩下的就是放入用户身份验证... 问题 与其余架构风格保持一致,我是否应该针对用户 db 验证每个服务调用。 如果是这样,我应该在每次调用服
假设我想对 Mifare Classic 进行身份验证。 我如何知道要发送到卡的确切类型的 APDU? 例子。 这段代码: bcla = 0xFF; bins = 0x86; bp1 = 0x0;
我通过在文件 xyz.php 中编写以下代码登录到网站。当我运行这个文件时,我会登录到 moodle 网站。有什么方法可以像下面的登录代码一样注销吗? $user = authenticate_use
我有一个应用程序可以匿名访问除几个之外的所有 xpages。我需要强制用户登录这些 xpages。是使用 beforepageload 事件来检查用户登录页面并将其重定向到正确的方式还是有更好的方法?
我想用 ember.js 实现身份验证。 因此,当应用程序启动时,在路由器处理请求的 url 之前,我想检查用户状态。如果用户未通过身份验证,我想保存请求的 url 并重定向到特定的 url (/lo
您如何执行 jQuery Ajax 调用并在发送请求之前对调用进行身份验证? 我还没有登录所以必须进行身份验证。安全不是任何人都可以访问的问题,只需要进行身份验证。它只是基本的 http 身份验证,您
我尝试使用找到的 swift 代码 here在网站上找到here ,但响应是带有两个错误的 html 代码:“您必须输入密码!”和“您必须输入用户名!”我是 NSURLSession 的新手,并尝试更
我正在尝试连接到 Visa Direct API,但我没有通过基本的 SSL 证书认证,这是我的代码: import requests headers = { 'Content
我正在用 tornado 在 python 中开发一个 REST API,我将实现身份验证和授权,试图避免锁定到其他大项目,即 django。我也在通过论坛和 SO 环顾四周,我喜欢一个可能适合的解决
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭10
如何在 Android 中通过 HTTP 进行身份验证? 最佳答案 我非常难以在 Android 中通过 HTTP 进行身份验证,因为在浏览器(Web 和 Android native )中它工作完美
我有一些关于登录和 session 的问题。我有这段代码: 数据库查询: login: function(req,callback) { var query = 'SELECT id FROM
我开始使用 Swift 开发 iOS 应用。现在我正处于需要创建登录系统的部分。但是,我们需要人们提供的 LinkedIn 信息。 我如何在 iOS 中使用 OAuth2 API 来实现这一点? 我已
如果没有找到用户,问题出在每个 $routeChangeStart 上,如果我只输入 url,它仍然会引导我访问页面。 现在我已经在服务器上重写了规则。 Options +FollowSymlinks
简单代码 require 'net/http' url = URI.parse('get json/other data here [link]') req = Net::HTTP::Get.new(
参考文档: https://docs.sonarqube.org/latest/instance-administration/security/ 概述 SonarQube具有
我是一名优秀的程序员,十分优秀!