0

私は PHP と PDO を初めて使用するので、SQL インジェクション以外のデータベースにアクセスするときに何を避ける (そして含める) べきかを完全には認識していません。(参考までに、表の下の例では、「ユーザー」にもパスワードが含まれています)しかし、次のような関数を使用してデータベースにアクセスして、情報を安全に取得できますか?攻撃されやすいですか?

なぜ私がこれを行ったのか理解できない場合は、それがより速く、テーブルをリンクするときに簡単になるためです:)

<?php
    require("access/common.php");
    function getval($username, $column, $table, $datab){
    $query = " 
    SELECT 
    id, 
    username,
    email 
    FROM ".$table." 
    WHERE 
    username = :username 
    ";
    $query_params = array( 
    ':username' => $username,
    ); 
    try 
    {
        $stmt = $datab->prepare($query); 
        $result = $stmt->execute($query_params); 
    } 
    catch(PDOException $ex) 
    {
        die(); 
    }
    $row = $stmt->fetch(); 
    if($row) 
    { 
        return $row[$column];
    }
    }
    echo getval("USERNAME", "email", "users", $db);
?>
4

2 に答える 2

1

あなたの質問は非常にオープンエンドです。攻撃の最大のベクトルは常に、ユーザー入力(ユーザーが $_GET または $_POST 変数を介してアプリケーション/Web サイトに送信できるもの) に対して行うことです。確かに、PHP 言語構造にはセキュリティ上の脅威はありません。機能。

あなたの例では、「:username」パラメーターをバインドしていますが、サニタイズされていないユーザー入力を受け入れて「$ table」値として使用すると、注入のベクトルになる可能性がある「:table」パラメーターはバインドしていないことがわかります。

$_GET および $_POST 値の使用方法には常に注意してください...これが面倒になったら、この一部を自動化するフレームワークを探してください。

于 2012-10-22T16:40:48.470 に答える
0

関数は、関数の外側のコードよりも安全でも安全でもありません。1 回または 2 回以上使用するものである場合は、必ず関数に入れます。PDO を適切に使用している限り、問題ありません。

とはいえ、すべてのデータベース関数をクラスに入れ、そのクラスの $db オブジェクトをインスタンス化し、そこから必要なデータベース関数を呼び出すことができます。作業を容易にするためにコードを整理する方法はたくさんあります。

于 2012-10-22T16:21:06.913 に答える