在注册过程中,我在讨论如何设置用户密码:
让用户选择它.如果我这样做,我必须执行一些标准(长度,弱点,可能涉及正则表达式等).当你选择这种方式时,你通常做什么?为什么?有没有可用于PHP的库?
自动为用户生成密码,并通过电子邮件将密码发送给他们提供的电子邮件.他们无法在没有获取密码的情况下登录,因此它也是电子邮件验证.问题是密码可能太难以让用户记住.如果我允许他们把它改成更容易的东西,那就首先打败了我为他们选择它的目的.我也担心在电子邮件中传输密码(作为简单的非散列密码)的行为.
我倾向于第二个,但在选择之前更喜欢更明智的答案.有可能我不关注用户便利性和其他技术问题.你是做什么?
编辑:根据答案,我将使用第一个选项,让用户选择.我的问题是,密码强度/长度等等.我应该要求,我该如何执行?有可用的PHP库吗?
我有这个函数进行ajax调用.我在最后一段代码注释中描述了这个问题.
function doop(){
var that = this;
var theold = "theold";
var thenew = "thenew";
$.ajax({
url: 'doop.php',
type: 'POST',
data: 'before=' + theold + '&after=' + thenew,
success: function(resp) {
if(resp == 1) {
$(that).siblings('.theold').html(thenew);
}
}
});
// I have some code here (out of the ajax) that **further** changes
// the .theold's html beyond what it was changed inside ajax success
// but the change depends on whether the resp (inside the success
// function) returned 1 …Run Code Online (Sandbox Code Playgroud) 谢谢你的期待.所有真诚有用的答案都被投了票.
我使用密码强度计让用户知道他们选择的密码有多强.但是这个密码检查器显然没有涵盖字典攻击密码的弱点.我该如何检查,是否值得?
此外,我的常规密码检查器最初在浏览器中使用javascript运行(无需传输).如果我想检查字典攻击弱点,我必须将其传输到脚本.我的理解是我不应该明确地传达它.
有人可以帮我解决这个问题.如何检查密码在字典攻击下是不是很弱,如何在传输到我的脚本之前对其进行加密?
额外信息:
除了常规密码计之外,为什么我认为我还需要字典攻击检查?正如你们中的一些人所指出的那样,用户可以选择像P @ ssword或Yellow12这样的密码.但是我遇到的大多数密码强度检查器都将此视为一个好密码.至少我正在使用Yet Another Password Meter而且确实如此(我实际上认为它是更好的密码检查器之一.)如果有人知道更强大的密码检查器,请提及它,但前提是您确实根据经验知道它更强壮;)
但我的问题是:我如何对密码进行字典攻击检查?我在某个地方看到它是针对哈希做的,但我在哪里进行搜索?一旦我知道如何做到这一点,我将决定它是否值得.
感谢所有到目前为止帮助过的人:)
我开始更多地关注让我的javascript和ajax优雅地降级.更推荐哪个:
我倾向于不同的页面集,因为我觉得它更容易,我可以为每种用户类型(js-enabled或js-disabled)提供最佳结果.你同意我的意见吗,如果没有,你为什么不同意?
我也担心黑客攻击.例如,黑客进入启用js的版本,然后禁用他的js.关于这一点的任何想法?我不太了解黑客攻击,但如果我使用不同的版本,这可能是一个安全问题吗?
提前致谢
我在页面上有许多输入字段的"集合",如下所示:
<div id="allthesets">
<div>
<input name="po-3" type="text">
<input name="ba-3" type="text">
</div>
<div>
<input name="po-9" type="text">
<input name="ba-9" type="text">
</div>
<div>
<input name="po-123" type="text">
<input name="ba-123" type="text">
</div>
</div>
<div id="rightafterthesets">
This is the div that comes right after the sets
</div>
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用jquery获得最大的索引(在本例中为123).请注意,每个集都在div中,但这些div没有唯一ID.但是所有的集合都包含在div中id="allthesets",div就在它之后id="rightafterthesets".由于最大的索引是最新的,我认为rightafterthesetsdiv可能有助于获得最后一个索引,如果我能以某种方式找出备份的方式.
我知道===PHP 中的运算符不仅意味着值相等,而且还意味着类型匹配
if (20 === "20") //false
Run Code Online (Sandbox Code Playgroud)
如果我使用jquery,javascript中是否有类似的东西?示例代码也可以提供帮助.
谢谢
谢谢你检查.所有有用的答案/评论都已经过投票.我有以下代码,它完成了这项工作,但是imo效率不高.我认为它不高效的原因是因为我使用fetchAll +循环,即使我知道查询将返回1或没有记录.
//assume the usual new PDO, binding, and execute are up here
$myval = "somevalue";
$res = $stmt->fetchAll(PDO::FETCH_ASSOC);
if (!$res) {
//no record matches
//BLOCK A CODE HERE
} else {
//found matching record (but always going to be 1 record, no more)
foreach($res as $row) {
if ($myval == $row['val']){
//myval is the same as db
//BLOCK B CODE HERE
} else {
//myval is different from db
//BLOCK C CODE HERE
}
}//foreach
}
Run Code Online (Sandbox Code Playgroud)
如何改进它以消除foreach和fetchAll的庞大外观(考虑到我知道它总是只有1或0记录)?但是我仍然需要类似的检查点,所以我可以BLOCK …
这可能听起来像一个无聊的问题,但安全领域的人会得到它.我应该让用户输入任意数量的字符,只要它大于0个字符.我的逻辑是:
我有没有走上正轨呢?
既然我在问下限问题,我不妨问一下上限?再次,它将被哈希和盐渍,因此数据库大小不是问题.那么在这种情况下我能想到的唯一问题是缓冲区比什么都重要,对吧?
更新对于那些迟到的问题
所以普遍的共识似乎证实了我最初的想法,即蛮力增加的风险.然而,由于他们没有关于尺寸的线索这一事实,RT破解者的工作不会那么困难.实际上它可能更容易,因为无论如何它们都从较低的字符表开始.正确?(更不用说现在出现的非技术性问题,而不是关注某个人的肩膀等等,这对于更长的密码并不是一个大问题.)
所以结论是:即使您对密码进行哈希/加密,短密码仍然存在风险
但是对于长密码,我不确定我有一个确定的答案?我应该担心缓冲区溢出,它毕竟仍然是一个常规输入字段.
假设我们有一个在数据库中的盐,并且已经像这样生成了
$salt = time();
这两行之间有什么区别.
$pass1 = hash('sha1', $password . $salt);
$pass2 = hash_hmac('sha1', $password, $salt);
Run Code Online (Sandbox Code Playgroud)
它们不会产生相同的输出.第一个,hash函数需要2个参数,而hash_hmac需要3个参数.因此,您可以认为我们可以通过$salt单独使用(以实现第三个参数)来获得第三个额外参数,而不是$password . $salt像我们在第2行中那样将其与密码()连接起来.但它并不那么简单,2个结果是不同.为什么?这到底发生了什么?
假设我有2个pdo语句,只是顺序不同(asc与desc)
$stmt1 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 DESC");
$stmt2 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 ASC");
Run Code Online (Sandbox Code Playgroud)
有没有办法可以动态绑定ASC/DESC,所以我只能有1个 stmt
$order = "ASC"; //or "DESC"
$stmt = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 order=:order");
$stmt->bindParam(':order', $order, PDO::PARAM_STR);
Run Code Online (Sandbox Code Playgroud) php ×5
javascript ×3
jquery ×3
passwords ×3
security ×3
ajax ×2
mysql ×2
pdo ×2
brute-force ×1
database ×1
dictionary ×1
encryption ×1
hash ×1
hmac ×1
indexing ×1
input ×1
refactoring ×1
registration ×1
synchronous ×1
syntax ×1