-1

こんにちは、PDO でログインしようとしていますが、いくつかの問題に直面しました。Kazkas blogai のメッセージがいつも届きます。実際、コードの問題がどこにあるのかわかりません。PHP コードの例を次に示します。

<?php

    session_start();

    $user = "asgasgasg";
    $pass = "jhgjkghjghj";

    /* Pirmas etapas */
    if(isset($_POST['accept'])){

    try {

    $connect = new PDO('mysql:host=localhost;dbname=abba_sql', $user, $pass);
    $connect->exec("SET CHARACTER SET utf8");


    $name=$_POST['name'];
    $pass=$_POST['pass'];
    $iname=htmlspecialchars($name);
    $ipass=htmlspecialchars($pass);

    /* Antras etapas */ 
    $sql = $connect->prepare("select * from FOO WHERE name = :name AND pass = :pass");
    $sql->execute(array(':name' => $iname, ':pass' => $ipass));
    $rows = $sql->fetchAll();
    $rowcount = count($rows);

    if($rowcount > 0){
        $_SESSION['login'] = "1";
        echo 'Viskas ciki';
    }
    else 
    {
        echo 'Kazkas blogai';
    }

    $connect = null;
  }

    catch(PDOException $e) {
        echo $e->getMessage();
    }
}



    else {


?>

お役に立てば幸いです。PDOの基本を理解しようとしています。アドバイスと助けをありがとう。

4

1 に答える 1

0

まず、このコードについて説明がなかったことをお詫びしたいと思います。また、コードが「コードブロック」内に入るように私の回答を編集してくれた人に感謝したいと思います。少し慌ててスマホから質問に答えた。電話でコードブロックやフォーマットを追加することはできませんでした.

変化する

$name=$_POST['name'];
$pass=$_POST['pass'];
$iname=htmlspecialchars($name);
$ipass=htmlspecialchars($pass);

$iname=$_POST['name'];
$ipass=$_POST['pass'];

しかし、ここにいくつかの説明があります:(まだ理解していない場合)

文字や数字以外の文字を含むユーザー名があり、ユーザー名が のhedge&hog場合、この例では値 $iname を に割り当てますhedge&amp;hog。(&に変換されるため&amp;)

この変換を行っているため、select-statement は次のようになります (実行されます)。

SELECT * FROM user WHERE username='hedge&amp;hog' AND password='sdf893'; //Example password

目的のクエリが次の場合:

SELECT * FROM user WHERE username='hedge&hog' AND password='sdf893'; //Example password

上記のクエリでは、明らかな理由により、データベースから異なる数の行が得られます...

関数htmlspeciarchars()は、主にHTMLを出力するために使用されるため、必要に応じて html エンティティを使用します。文字のエスケープには使用されませんが、これはあなたの意図によるものだと思います。

準備済みステートメントを使用する場合、文字列を文字列に挿入する前に文字列をエスケープする必要はありません。これは、実際の値が実際のクエリに含まれていないためです。それらは単なるプレースホルダーです。次に、PDO (または mysqli) が、execute()、fetch() などの関数を介してエスケープ処理を行います。

値をプレースホルダーにすると、準備済みステートメントを使用しない場合よりもはるかに安全になります。

例: 準備済みステートメントの場合:

SELECT * from username WHERE username=:username

準備済みステートメントなし:

SELECT * from username WHERE username='hedge&hog'

上記の最初のクエリを mysql-client で実行すると、エラーが返され、db-engine はそれを処理しません。db-engine のヘルプ機能がなければ、まったく役に立ちません。したがって、コードを使用せずに操作することは不可能です。

2 番目のクエリを見ると、db-engine だけでユーザー名を実行および操作することが可能です。

したがって、準備されたステートメントを使用すると非常に安全です。

これがさらに役立つことを願っています!

于 2013-05-08T15:59:07.510 に答える