Php 将纯文本密码登录转换为哈希
可能重复:Php 将纯文本密码登录转换为哈希,php,hash,login,passwords,Php,Hash,Login,Passwords,可能重复: 我正在为我的网站编写一个PHP脚本,该网站已经启动并运行。我的问题是,在网站上注册的是纯文本密码。显然,这是非常脆弱的安全。我希望有人能帮我转换它,这样我就可以使用哈希密码。 我已经包括了我认为重要的部分注册码。我没有在页面上包括所有代码,因为我认为它不相关,但如果有人认为它会有帮助,我会提供 require 'include.inc'; if ($signup) { if ($signup[repassword] != $signup[password]) { $err
我正在为我的网站编写一个PHP脚本,该网站已经启动并运行。我的问题是,在网站上注册的是纯文本密码。显然,这是非常脆弱的安全。我希望有人能帮我转换它,这样我就可以使用哈希密码。 我已经包括了我认为重要的部分注册码。我没有在页面上包括所有代码,因为我认为它不相关,但如果有人认为它会有帮助,我会提供
require 'include.inc';
if ($signup) {
if ($signup[repassword] != $signup[password]) {
$err_msg = "Your passwords do not match.";
error($err_msg);
}
if(!preg_match("^[_\.0-9a-z-]+$/i^", $str)) {
$msg = 'Invalid Username! Usernames can consist of letters and numbers only';
}
if(!preg_match("^[_\.0-9a-z-]+$^",$signup[password])) {
$err_msg = "Invalid Password! Passwords can consist of letters and numbers only.";
}
if(!$signup[password] || !$signup[username] || !$signup[email] || !$signup[username])
$err_msg = "Oops! You forgot some important fields!";
if (!$err_msg) {
$usercheck = @mysql_query("INSERT INTO user values(
'NULL','$signup[fname]','$signup[lname]',
'$signup[username]','$signup[password]','$signup[email]', 1, ".$pointInc.", '$signup[referral]', NOW(), 'n', 'y')");
// done, you are entered correctly, Now Enter the points and URL info
$sql = "Select id from user where username='$signup[username]'";
$result = mysql_query( $sql );
if ( $result != false )
{
while ( $data = mysql_fetch_assoc( $result ) )
{
$point_set = $data['id'];
}
} else {
echo mysql_error();
}
// add rerral points
if ($signup[referral]) {
$referralSql="UPDATE points SET points=points+ ".$refPoints . " WHERE userid=".$signup[referral];
$result = mysql_query( $referralSql );
if ( $result != false )
{
} else {
echo mysql_error();
}
}
// add URL
$sql="INSERT INTO url_table ( userid, website, active, datechanged) VALUES ($point_set,'".$signup[site_url]."','n', '".date("Ymd")."')";
$result = mysql_query( $sql );
if ( $result != false )
{
} else {
echo mysql_error();
}
// add points
$sql="INSERT INTO points (userid, username, points) VALUES ($point_set,' ',$signPoints)";
$result = mysql_query( $sql );
if ( $result != false )
{
} else {
echo mysql_error();
}
}
echo mysql_errno().": ".mysql_error()."<br>";
if (!$usercheck) {
$err_msg = "Database error:<br>There was an error entering your account.<br>It is possible that username or Email already exists, please try another one.<br>";
} else {
include ("reg.php");
exit;
}
}
if (!$err_msg) {
// done, you are entered correctly
}
pageHeader($title, $bgColor, $styleSheet);
?>
要求“include.inc”;
如果($注册){
如果($signup[repassword]!=$signup[password]){
$err\u msg=“您的密码不匹配。”;
错误($err_msg);
}
如果(!preg_match(“^0-9a-z-]+$/i^,$str)){
$msg='用户名无效!用户名只能由字母和数字组成';
}
如果(!preg_match(“^[\u\.0-9a-z-]+$^,$signup[password])){
$err_msg=“密码无效!密码只能由字母和数字组成。”;
}
如果(!$signup[密码]| |!$signup[用户名]| |!$signup[电子邮件]| |!$signup[用户名])
$err_msg=“哎呀!你忘了一些重要字段!”;
如果(!$err\u msg){
$usercheck=@mysql\u query(“插入到用户值中(
'NULL'、'$signup[fname]、'$signup[lname],
“$signup[username]”、“$signup[password]”、“$signup[email]”、1、“$pointInc.”、“$signup[reference]”、NOW()、“n”、“y”);
//完成后,输入正确,现在输入点和URL信息
$sql=“从用户名为“$signup[username]”的用户中选择id”;
$result=mysql\u查询($sql);
如果($result!=false)
{
而($data=mysql\u fetch\u assoc($result))
{
$point_set=$data['id'];
}
}否则{
echo mysql_error();
}
//加分
如果($注册[转介]){
$referralSql=“更新点设置点=点+”$refPoints。“其中userid=”.$signup[reference];
$result=mysql\u查询($referralSql);
如果($result!=false)
{
}否则{
echo mysql_error();
}
}
//添加URL
$sql=“插入url_表(用户ID、网站、活动、日期更改)值($point_set,“$signup[site_url]”、'n'、'”。日期(“Ymd”)。“)”;
$result=mysql\u查询($sql);
如果($result!=false)
{
}否则{
echo mysql_error();
}
//加分
$sql=“插入点(用户ID、用户名、点)值($point_set,,$signPoints)”;
$result=mysql\u查询($sql);
如果($result!=false)
{
}否则{
echo mysql_error();
}
}
echo mysql_errno().“:”.mysql_error().“
”;
如果(!$usercheck){
$err_msg=“数据库错误:
输入您的帐户时出错。
可能用户名或电子邮件已经存在,请尝试另一个。
”;
}否则{
包括(“reg.php”);
出口
}
}
如果(!$err\u msg){
//完成后,您的输入正确
}
页眉($title,$bgColor,$styleSheet);
?>
您可以使用md5函数为密码创建哈希,例如:
$password = '12345';
$password = md5($password);
您将此散列保存在数据库中,并在检查登录的用户和密码时执行此操作
$post['password'] = md5($post['password']);
并检查是否等于数据库中保存的哈希值。
我知道md5不是最好的散列,但它很简单,安全性也很好基本原理很简单: 一,。当用户注册时,不要存储明文密码,而是
hash(password)
二,。当用户尝试登录时,使用存储在用户数据库中的哈希值计算输入密码的哈希值。如果两个哈希值都匹配,则密码是正确的
$query = $pdoObject->prepare('SELECT * FROM users WHERE UserName = :u AND Password = :p');
$query->bindParam(':u', $_POST['username']);
$query->bindParam(':p', hash($_POST['password']));
// We locate the original user by searching for the hash of the password that they typed in
理论到此为止。您应该考虑的一些实际问题:
hash()
函数)以了解可用的哈希算法SQL注入的攻击。如果您不这样做,那么用户将能够通过输入撇号(”
)等字符来搞乱您的网站
用于对密码进行哈希运算。有些观点认为md5或SHA-1不易破解,尝试对它们进行加密。。搜索该漏洞。您有SQL注入漏洞。
密码只能由字母和数字组成。
。。这是非常错误的。不要限制我的密码中可以包含的字符。。。。它限制了我,增加了代码的复杂性,降低了安全性,而且完全没有必要为字符串创建哈希很容易,而且需要多次,只是!尝试此链接或使用普通MD5作为哈希算法是非常不安全的。MD5散列的计算速度非常快(使暴力变得简单),而且算法容易发生冲突。使用uniqid进行散列有什么意义?无论如何,+1表示指向更好的资源。md5实际上不是哈希密码的好选择。@Giuliomusarello这是为了让询问者对安全性有更多的了解。谢谢:)@troelskn是的,但这是开始阅读、学习的好方法,而且只要你不保护你的登录表单不受外部请求的影响,没有人会尝试破解这样的代码
$query = $pdoObject->prepare('SELECT * FROM users WHERE UserName = :u AND Password = :p');
$query->bindParam(':u', $_POST['username']);
$query->bindParam(':p', hash($_POST['password']));
// We locate the original user by searching for the hash of the password that they typed in