这确实属于prereview.stackexchange.com,但无论如何我都会试一试。
首先,我将向您的表单添加一个csrf令牌以阻止这些类型的攻击。
//the most simple type of csrf tokenif (!isset($_SESSION['token'])): $token = md5(uniqid(rand(), TRUE)); $_SESSION['token'] = $token;else: $token = $_SESSION['token'];endif;
然后在您的表单中,包含一个隐藏的输入字段:
<input type="hidden" name="token" id="token" value="<?php echo $token; ?>"/>
然后在您的ajax中添加令牌。
var usrnm = $('#usrnm').val();var pswdlogin = $('#pswdlogin').val();var token = $('#token').val();{ usrnm: usrnm, pswdlogin: pswdlogin, token: token}
然后在您的php中,让我们直接停止访问该页面时发生的未定义索引错误。
$usrnm_original = isset($_POST['usrnm'])?$_POST['usrnm']:false;$pswdlogin_original = isset($_POST['pswdlogin'])?$_POST['pswdlogin']:false;$token = isset($_POST['token'])$_POST['token']:false;
然后,我们需要检查传递的令牌是否与我们的令牌相同
if(!$_SESSION['token'] == $token): die('CSRF Attacks are not allowed.');endif;
然后
mysqli_query,即使接受
mysqli_real_escape_string和使用
prepared语句进行了消毒,我们也需要在接受用户数据时停止使用。此外,过程样式代码使我哭泣,因此我们将对其进行更改。此外,让我们返回一个带有状态和消息的数组,以便更轻松地处理错误和成功报告。
$ret = array();$mysqli = new mysqli("localhost", "cSDEqLj", "4GFU7vT", "dbname");if($sql = $mysqli->prepare('SELECt * FROM registration WHERe email = ? and password = ?')): $sql->bind_param('ss', $usrnm_original, $pswd_original); if($sql->execute()): $sql->fetch(); if($sql->num_rows > 0): $ret['status'] = true; $ret['msg'] = 'You have successfully logged in! Redirecting you now'; else: $ret['status'] = false; $ret['msg'] = 'The credentials supplied were incorrect. Please try again'; endif; endif; $sql->close(); return json_enpre($ret);endif;
现在,我们需要修改您的发布功能。
$.post("http://xyz/mobile/php/logmein.php",{ usrnm: usrnm, pswdlogin: pswdlogin, token:token},function(data) { if (data.status == true) { window.open("http://xyz/mobile/home.html?email=" + usrnm + "", "_parent"); } else { alert(data.msg); $('#loginstatus').text(data.msg); }}, 'json');
最后,也是最重要的是,您使用了纯文本方式的密码方法,从安全角度来看这是没有意义的。这正是您被黑客入侵的方式。相反,您应该至少使用
sha256哈希方法。更改密码存储在数据库中的使用方式,
sha256然后将其传递到SQL选择器中进行比较,例如:
$pswdlogin_original = isset($_POST['pswdlogin'])? hash('sha256', $_POST['pswdlogin']):false;
并且当保存在数据库中时,该密码将看起来像
fcec91509759ad995c2cd14bcb26b2720993faf61c29d379b270d442d92290eb例如。
我的回答是为了清楚起见,但实际上,您甚至不应该重塑事物。那里有大量的应用程序和框架,已经花了无数小时来保护其身份验证系统。我建议您仔细阅读所有这些内容,因为它们将帮助您建立核心编程技能并教授基本的OOP练习。
- Lararvel 4.x
- Zend 2
- hal
- YII
希望这对您有所帮助。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)