0

我遵循了手册上的教程,以使我的登录代码更安全,这在遵循http://www.w3schools.com/php/func_mysql_real_escape_string.asp上的教程后现在无法正常工作, 它显示以下错误

警告:mysql_num_rows() 期望参数 1 是资源,布尔值在第 32 行的 /home/content/58/9508458/html/pabrowser/checklogin.php 中给出

警告:无法修改标头信息 - 标头已由 /home/content/58/9508458/html/pabrowser/checklogin 中的(输出开始于 /home/content/58/9508458/html/pabrowser/checklogin.php:32)发送。第 46 行的 php

并且没有登录

<?php
function check_input($value)
{
// Stripslashes
if (get_magic_quotes_gpc())
  {
  $value = stripslashes($value);
  }
// Quote if not a number
if (!is_numeric($value))
  {
  $value = "'" . mysql_real_escape_string($value) . "'";
  }
return $value;
}

$link = mysql_connect('xxxxxxx');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
mysql_select_db("brainoidultrafb", $link);

// username and password sent from form 
$myusername=check_input($_POST['myusername']); 
$mypassword=check_input($_POST['mypassword']); 

 $sql="SELECT * FROM logintbl WHERE stu_email='$myusername' and password='$mypassword'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){

// Register $myusername, $mypassword and redirect to file "login_success.php"

session_start();
$_SESSION['username'] = $myusername;
$_SESSION['password'] = $mypassword;

header("location:login_success.php");
}
else {
header('Location: http://www.xxxxxx.com/pabrowser/index.php?succmsg1=INVALID.RETRY');
}
?>

有什么建议可以让它更安全吗?

4

1 回答 1

1

问题是您的check_input函数已经引用了字符串,因此插入结果而不包含引号:

$sql = "SELECT * FROM logintbl
        WHERE stu_email = $myusername AND password = $mypassword";

至于使其更安全的建议:

  1. mysql_如评论中所述,删除并使用参数化查询。它可以帮助您避免胡说八道,这些胡说八道很容易被意外遗漏。
  2. 不要将用户的密码以明文形式存储在数据库中。对它们进行散列,最好使用盐,最好使用独特的盐,最好使用像 bcrypt 这样的慢速散列。
于 2012-06-25T16:27:52.587 回答