0

http://www.w3schools.com/php/func_mysql_real_escape_string.aspのチュートリアルを実行した後、ログインコードをより安全にするために、手動でチュートリアルを実行しました が、次のエラーが表示されます。

警告:mysql_num_rows()は、パラメーター1がリソースであると想定しています。ブール値は/home/content/58/9508458/html/pabrowser/checklogin.phpの32行目にあります。

警告:ヘッダー情報を変更できません-/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 に答える