对于每个分类广告,用户都需要输入一个密码(这样他们可以随时删除该广告)。
因此,当有人想要删除一个分类广告时,他们点击分类广告,点击删除按钮,然后输入密码。
我使用MySql作为数据库。
我基本上使用这段代码:
if ($pass==$row['poster_password'])
其中row [poster_password]是从MySql获取的...
你觉得呢? 谢谢
if ($pass==$row['poster_password'])
其中row [poster_password]是从MySql获取的...
你觉得呢? 谢谢
请查看:PHP密码的安全哈希和盐
在将密码存入数据库之前,使用哈希(可能加上一些盐)对其进行处理。将哈希后的密码存储在数据库中(而不是实际密码)。然后从数据库中获取他们的哈希密码,对其输入密码进行哈希并比较哈希密码。
以下是一些伪代码:
password_hash = hash(password_cleartext)
# store password_hash in database
稍后:
input_password_hash = hash(input_password_cleartext)
fetched_password_hash_from_db = fetch(db, password_hash)
if (input_password_hash == fetched_password_hash_from_db) {
... authenticated ...
}
如果你想学习php技术,可以尝试使用以下链接:http://php.net/manual/en/function.sha1.php
你的代码看起来很安全,但是你的设计可能需要一些改进。
SQL注入
代码中的危险部分在于将任何从用户收集而来的数据存储到数据库中或向用户显示。因此,在你的示例之前,你必须小心处理。确保你对从用户收集的任何数据进行验证、过滤和转义,包括密码和广告信息。
加密
将密码存储在数据库中的好处是,如果用户忘记密码,你可以让用户通过电子邮件或其他方式检索密码。
然而,如果你确实存储了密码,那么你应该使用一个秘密密钥对它们进行加密,以便如果有人能够直接读取你的数据库,他们不能以明文形式读取所有密码。不过,你仍然需要在某个地方存储秘密密钥,如果有人获取了你的秘密密钥并且有权访问你的数据库,他们就可以访问所有密码。
哈希值(推荐)
最佳做法和更安全的方法是只在数据库中存储单向哈希值(SHA1或SHA256),而不是实际的密码。这样,你就无法检索密码。哈希值意味着通过丢弃一些数据来实现单向。
在这种情况下,你不是检索原始密码,而是对用户输入的密码进行哈希,并将哈希值与存储的哈希值进行比较,以查看是否匹配。如果用户在这种情况下忘记了密码,你不会将密码发送给用户,而是发送一个新的、随机生成的密码。
仅存储哈希值可以进一步保护你的数据,因为即使用户具有读取数据库的访问权限,哈希值也没有任何优势,也没有秘密密钥可以解锁所有哈希值。
在哈希密码时,请确保使用随机盐值并存储盐值,以保护你的哈希列表免受彩虹攻击。
总结
有时你不能选择密码。有时密码来自另一个系统,所以你并不总是有选择的余地,有时你的上级(甚至用户)会要求能够检索密码,但是在可能的情况下,你应该选择更安全的选项。
请注意,所有这些加密和哈希值业务只能部分保护你的服务器免受能够获得只读访问权限的人的攻击。有时候,获取你的数据就足够了,所以如果用户可以读取密码哈希值,他们能否读取你的信用卡号码?
你需要保护你的数据库。你的数据库系统使用安全密码了吗?你只允许本地访问你的数据吗?你是否创建了一个具有最少权限的数据库用户来在应用程序中使用?你是否正确地保护自己免受SQL注入和脚本攻击?
如果有人具有读写数据库的访问权限,整个密码业务就变得无意义。
不要将实际密码存储在数据库中,而是存储校验和(MD5,SHA1等)。当您想进行比较时,请对用户提交的值执行校验和,并比较校验和。
这样就不会在内存中保存实际密码。
最佳实践是在数据库中保存一个带盐的 sha1 哈希:
if (sha1($pass.$row['poster_salt'])==$row['poster_password'])
(poster_salt是在用户选择密码时生成和保存的随机字符串。)
这样,如果攻击者获得了访问您的数据库的权限,他们仍然无法获取用户的密码(这些密码可能也被用于其他地方 - 大多数人不会为不同的网站选择不同的密码)。
此外,您应该使用安全(HTTPS)连接。并要求足够强大的密码。
(至少如果您想要良好的安全性,在简单的广告列表的情况下可能有点过头。)
这意味着密码以未加密的形式存储在您的密码中。如果是这种情况,输入密码时应使用某种加密方式。一种方法是使用哈希密码的MD5函数进行加密。
在执行插入操作时,您可以执行以下操作
Insert into table(email, password, whatever) values('$email', md5($password), whatever)
当进行比较时,您需要执行以下操作
if (md5($pass) == $row['password'])
我的建议如下:
用户表应该有两列,一列叫做“密码”,另一列叫做“盐”。
$password = 'youruserpassword in plain text';
$salt = bin2hex(openssl_random_pseudo_bytes(32));
$passtostore = hash_hmac('sha384', $password, $salt);
insert into users(password, salt) values($passtostore, $salt);
然后验证用户是否输入了正确的密码...
从数据库中检索密码和盐,并进行比对。
if(hash_hmac('sha384',$userpass, $row['salt']) === $row['password']) {
// is valid
}
你应该以某种方式对密码进行哈希处理,然后使用哈希版本进行存储和比较。请参阅此链接以获取更多详细信息:
在存储密码之前,我会对其进行加密,然后在检索时进行解密,以便您可以将其与用户以明文输入的内容(根据您上面的示例代码)进行比较。
此外,请保护自己免受任何SQL注入攻击,否则某人可能会看到您数据库中的所有密码(和其他数据)。