-1

重複の可能性:
PHP で SQL インジェクションを防止する最善の方法

ユーザーの入力をデータベースに挿入しようとしています。
この pdo とハッシュは十分に安全ですか:

$dbh = new PDO("mysql:host=hostName; dbname=dbName", "user", "pass");
if(isset($_POST['Submit']))
{
$user = $_POST['user'];
$pass = $_POST['pass'];
$salt = substr(str_replace('+', '.', base64_encode(sha1(microtime(true), true))), 0, 22);
$hash = crypt($pass, '$2a$12$' . $salt);
$mail = $_POST['mail'];
$confirm_key=md5(uniqid(rand()));

$sth = $dbh->prepare("INSERT INTO members(user, pass, mail, confirm_key)
VALUES ('$user', '$hash', '$mail', '$confirm_key')");
$sth->execute();
4

2 に答える 2

4

SQL インジェクションとは何か、パスワードをハッシュする理由について少し混乱しているようです。

パスワードのハッシュ化 (およびソルティング) が行われるため、データベースにはパスワードを検証するのに十分な情報が含まれますが、パスワードを取得するのに十分な情報は含まれません。攻撃者がデータベースへの (オフラインでの) アクセスを取得した場合でも、安全なハッシュをクラックしない限りパスワードを読み取ることはできません。この目的のために、コードは合理的に見えます。

SQL インジェクションは、まったく別の獣です。このエクスプロイトは、PHP コードに値を送信することで機能します。この値を動的 SQL クエリに挿入すると、興味深い方法でコードを壊し、クエリが意図したものとは異なることを実行するようにします。たとえば、ユーザーはクエリを有効に$user保つための値を提供できますINSERTが、引用符で囲まれた文字列から抜け出して 2 つ目のクエリを追加すると、他のすべてのユーザーのパスワード ハッシュを既知の値で上書きするなどの有害なことが行われる可能性があります。攻撃者は、任意のアカウント (管理者を含む) にログインできます。

SQL インジェクションを防ぐ最善の方法は、PDO がすぐに使用できるパラメーター化されたクエリを使用することです。ただし、それらを使用していないため、コードは脆弱です。PDO のパラメーター化されたクエリに関するドキュメントを読んでください。それらがどのように機能するかがわからない場合は、お気軽に戻ってもう一度質問してください。

于 2012-08-05T12:46:48.863 に答える
2

準備されたステートメントを悪用しています。コードを次のように変更してください。

$stmt = $dbh->prepare("INSERT INTO members(user, pass, mail, confirm_key) VALUES (:user, :hash,:mail,:confirm)");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':hash', $hash);
...

詳しくはこちらをご覧ください。

于 2012-08-05T12:45:51.327 に答える