我写了一封新的电子邮件表单。我已经实现了一些好人在这里建议的东西,所以我尽力使它既简单又安全,虽然我不确定我是否成功后者认为我现在仍然坚持使用旧的MySQL API 。我觉得我必须解释原因。这是因为整个网站都在使用mysql而我没有时间切换到PDO,至少目前还没有。
我没有通过!preg_match
运行密码,但不确定这是否会使输入容易受到某种攻击?我有一种感觉,当使用!password_verify
时,我可以高枕无忧。
登录表单使用昵称,电子邮件和密码登录。
这是我的代码:
if (@$_POST['login']) {
$nickname = mysql_real_escape_string($_POST['nickname']);
$email = $_POST['email'];
$password_input = $_POST['password'];
// validation 1 ------- //
else if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
$error = "Wrong nickname password or email.";
}
else if (!preg_match("/^[a-zA-Z0-9]{3,30}$/",$_POST['nickname'])) {
$error = "Wrong nickname password or email.";
}
// validation 2 ------- //
else { //password check
$password_query = mysql_query ("SELECT password FROM userbase WHERE email='$email' && nickname='$nickname'");
$password_actual = mysql_result ($password_query, 0);
if (!password_verify($password_input, $password_actual)) {
$error = "Wrong nickname, password or email.";
}
else {
LOGIN SUCCESSFUL
如果被!preg_match
转义,$_POST['nickname']
需要mysql_real_escape_string
吗? (安全老虎钳)
答案 0 :(得分:1)
即使使用mysql_real_escape_string
,MYSQL和MYSQLI函数也极易受SQL注入攻击。
How can I prevent SQL-injection in PHP?
我已将您的代码从MYSQLI转换为PDO,这些SQL语句是由数据库服务器与任何参数分开发送和解析的。
$con = new PDO('mysql:host=localhost;dbname=name', 'user', 'pass');
if ($_POST['login']) {
$nickname = $_POST['nickname'];
$email = $_POST['email'];
$password_input = $_POST['password'];
else if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
$error = "Wrong nickname password or email.";
}
else if (!preg_match("/^[a-zA-Z0-9]{3,30}$/",$_POST['nickname'])) {
$error = "Wrong nickname password or email.";
}else{
$password_query = $stmt = $con->prepare("SELECT password FROM userbase WHERE email=:email && nickname=:nickname");
$stmt->bindParam(':email', $email);
$stmt->bindParam(':nickname', $nickname);
$stmt->execute();
if($password_query->rowCount() > 0) {
$row = $stmt->fetch();
if(!password_verify($password_input, $row['password'])) {
$error = "Wrong nickname, password or email.";
}else{
//LOGIN SUCCESSFUL
}