-2

real_escape_stringsなどのmysql関数で使用しているログインシステムがあります。しかし今、私はそれをmysql関数よりも新しいのでPDOに変換しようとしています。問題は、PDOでは機能しないことです。以下は私のコードです。私が間違っていることを教えてください。

<?php
try {
$con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');

} catch(PDOException $e){
echo 'Connection failed'.$e->getMessage();
}

?>
<?php 
$is_ajax = $_POST['is_ajax'];
    if(isset($is_ajax) && $is_ajax)

    {
$username =(isset($_POST['username']))? trim($_POST['username']): '';
$Password=(isset($_POST['Password']))? $_POST['Password'] : '';
$redirect=(isset($_REQUEST['redirect']))? $_REQUEST['redirect'] :
'view.php';
$query ='SELECT username FROM tish_user WHERE '.
'username="'.($username,$con).'" AND ' .
   'Password = md5("'.($Password,$con).'")';
  $result = $con->prepare($query); 
   $result->execute();
        if(count($result)>0)
        {
        $_SESSION['username']=$username;
$_SESSION['logged'] = 1;
            echo "success"; 
        }
        else {
//set these explicitly just to make sure 

}
    }

?>
4

2 に答える 2

2

役に立たないコードをすべて削除した後

<?php
$con = new PDO('mysql:host=localhost;dbname=tish_database;charset=utf8','root','');

if(!empty($_POST['is_ajax']))
{
    $sql = 'SELECT id FROM tish_user WHERE username=? AND Password = md5(?)';
    $stm = $con->prepare($sql); 
    $stm->execute(array($_POST['username'],$_POST['Password']));
    if($row = $stm->fetch())
    {
        $_SESSION['id'] = $row['id'];
    }
}
?>

大文字と小文字もチェックする必要があります。大文字の「パスワード」は疑わしいようです。1つの標準(すべて小文字)を選択し、それに従ってください。

これが、プリペアドステートメントがSQLインジェクション攻撃からどのように保護できるかについての私の答えです。それがどのように機能するかを説明する質問

于 2013-02-17T08:24:19.660 に答える
0
$query ='SELECT username FROM tish_user WHERE username=? AND Password = md5(?) )';
$result = $con->prepare($query); 
$result->execute(array($username, $password));

これにより、文字列が自動的にエスケープされます。

于 2013-02-17T08:21:19.967 に答える