2011-12-03 24 views
1

私はこの問題を解決するためにまだ見つけていません。たとえば、私は現在、jQueryを使用して、Ajaxを介して私が書いたPHPスクリプトにデータを投稿しています。 Ajaxリクエストによって送信されたデータにmysql_real_escape_string()を使用すると、ユーザー名は完全に削除され、MD5ではパスワードが再ハッシュされます。私の完全なコードは以下の通りです。私はmysql_real_escape_string()の問題であると信じています。両方の入力から関数を削除すると、フォームはシームレスに動作するからです。どんな解決策の前に誰かがこの問題に遭遇しましたか?ありがとう!jQuery AjaxとPHPのサニタイズ

EDIT:

<?php 
function dbConnect() { 
    $db = new mysqli("", "", "", ""); 
    return $db; 
} 
$username = mysql_real_escape_string($_POST["username"]); 
$sanPass = mysql_real_escape_string($_POST["password"]); 
$password = md5($sanPass); 
$db = dbConnect(); 
$query = "SELECT * FROM `users` WHERE `username`='$username' AND `password`='$password';"; 
$res = $db->query($query); 
$num = mysqli_num_rows($res); 
if ($num == 0) { 
    echo "incorrect u=" . $username . " p=" . $password; 
} else { 
    $row = $res->fetch_assoc(); 
    $uuid = uniqid(rand(0, 10000)); 
    setcookie("jBootUsername", $username); 
    setcookie("jBootUUID", $uuid); 
    setcookie("jBootIP", $_SERVER["REMOTE_ADDR"]); 
    $ip = $_SERVER["REMOTE_ADDR"]; 
    $query = "INSERT INTO `sessions` (username, cookie, ip) VALUES ('$username', '$uuid', '$ip');"; 
    $db->query($query); 
    echo "success"; 
} 
?> 

login.js:また、データは両方のフィールドのためのスクリプトに渡されている、私はecho print_r($_POST, true);

login.phpでこれを確認しました

$(document).ready(function() { 


var $body = $('body'), 
    $content = $('#content'), 
    $form = $content.find('#loginform'); 


    //IE doen't like that fadein 
    if(!$.browser.msie) $body.fadeTo(0,0.0).delay(500).fadeTo(1000, 1); 


    $("input").uniform(); 


    $form.wl_Form({ 
     status:false, 
     onBeforeSubmit: function(data){ 
      $form.wl_Form('set','sent',false); 
      if(data.username || data.password){ 
       $.ajax({ 
        type: "POST", 
        url: 'functions/login.php', 
        data: 'username=' + data.username + '&password=' + data.password + '', 
        success: function(data) { 
        if (data == "success") { 
         document.location="home.php"; 
        } else { 
         alert(data); 
         $.wl_Alert("Login invalid, please try again.",'info','#content'); 
        } 
        } 
       }); 
      }else{ 
       $.wl_Alert('Please provide both a username and password to login.','info','#content'); 
      } 
      return false; 

     }        
    }); 


}); 

答えて

4
  1. ヨーあなたはmysqliを使用しているので、mysql_real_escape_string()を使用しています。代わりにmysqli_real_escape_string()を使用するか、クエリをよりよく準備してください$mysqli->prepare()
  2. とにかく、データベースに接続する前にmysql_real_escape_string()を使用していたので、FALSEを返しました。しかし、それはあなたがmysql_を使用されていたであろう念のためです*

UPDATE:mysqli_real_escape_stringで

引数は()あなたが最初の$リンク識別子を渡す必要があり、スワップ、および可変の第2のとおりです。

とにかく、あなたが準備し、バインドのparamを持つ方が良いかもしれません:

$db = dbConnect(); 
$username = $_POST['username']; 
$password = md5($_POST['password']); 
$sql = "SELECT * FROM `users` WHERE `username`= ? AND `password`= ?;" 
$stmt = $db->prepare($sql); 
$stmt->bind_param('ss', $username, $password); 
$stmt->execute(); 
if($stmt->num_rows == 0) 
{ 
echo "incorrect username and/or password"; 
} 
else 
{ 
    $row = $stmt->fetch_assoc(); 
    //... 
} 
+0

私は、あなたのソリューションの両方を試してみた 'mysqli_real_escape_stringは()'も単なるテキストデータが含まれている全ユーザ名の入力を削除します。それはまた前と同じようにパスワードを再ハッシュします...何が間違っているのか分かりません。 –

+0

@scjosh更新私の答え –

+0

ありがとう、ダミアン。仕事は完璧です。 :) –