2012-03-30 12 views
1

いくつかの例と人々がこの方法でログインフォームでデータベースを照会しているのを見ました。 これがログインフォームを安全にする最良の方法であるかどうかは十分にはわかりません。ログインフォーム用のシンプルなSQLインジェクションソリューション?

これは、PHPでのクエリです:

$query = "SELECT * FROM users WHERE usern = '".$_POST['username']."' AND passw = '".md5($_POST['password'])."'"; 

は十分なSQLインジェクションを防ぐために、パスワードのポスト上)(MD5をしています?。 私は、md5関数はすべての文字とSQL文字列を32文字の文字列に変換すると思います。

ログインフォームを保護するその他の方法はありますか?

答えて

6

mysql_real_escape_string($_POST['username'])など

それはmysqli拡張子を使用して準備されたステートメントを使用することをお勧めしますが、

(MySQLを使っていると仮定)

編集:以下のコメントを受けて、LIKEクエリのためにこれを使用すると良いかもしれません:

addcslashes(mysql_real_escape_string($_POST['username']), '%_')

+1

+1準備されたステートメントの場合**データ**として挿入しようとしているデータを渡す方が、あなたが書いたSQL文字列をユーザからの信頼できない文字列と混同させるよりもずっと役に立ちます – Deebster

+0

あなたは** "mysql_real_escape_string()" **は "%"をエスケープしません。 php.net/manual/en/function.mysql-real-escape-string.phpのノートセクションをチェックしてください。 –

+1

はい、それは 'LIKE'を使うときの唯一の問題です。 'addcslashes()'を使ってそれを手助けすることができます。 – MichaelRushton

0

は、データベースの近くにデータを保存する前にデータをサニタイズする必要があります。これを行う最も簡単な方法はmysql_real_escape_string($_POST['username'])を使用することですが、これは最低限必要な作業です。

CodeIgniterのようなフレームワークを使用している場合、XSSリスクの$ _POSTまたは$ _GET入力を取り除くインビルド機能を使用できます。そうでなければ、私はこれらの記事をお勧めします:

0

あなたがする必要があります$_POST['username']同様に

とはいmd5は、SQLインジェクションからあなたを守ります。この例では

、このようなものが

$query = "SELECT * FROM users WHERE MD5(usern) = '".md5($_POST['username'])."' AND passw = '".md5($_POST['password'])."'"; 
+0

'MD5'はユーザー名ですか? – MichaelRushton

+0

私が知っている明るいアイデアではなく、質問の文脈の中で答えましたが、ユーザー名を比較するのではなく、ユーザー名のmd5を比較してください。少なくとも、ログインのインジェクションについて心配する必要はありません。 – marvin

+0

彼は 'INSERT'または' UPDATE'を実行して 'usern'を' SET'しようとするまで、 :) – MichaelRushton

0

OKだろうあなたが簡単にあなたのクエリを作成してい方法は、ユーザ名にコードの断片を挿入することができます。準備されたステートメントを使用すると、次のことを回避できます。 http://php.net/manual/en/pdo.prepared-statements.php

準備済みステートメントは、基本的にステートメントの構造を記述し、後でデータを追加します。このようにして、ユーザーは入力データで文の構造を変更することはできません。

0

あなたはすべての投稿をサニタイズして、変数と

function clean() { 
    foreach($_POST as $key => $val) { 
     $_POST[$key] = mysql_real_escape_string($val); 
    } 
} 

することもできますuse PDO and statements安全で取得し、PDOが自動的にきれいになる機能を加えた場合。そのSQLコマンド文字列は、分離可能なパラメータから送信され、その後、攻撃者は唯一の空白responses.Whenパラメータがあり得ますので

0
<?php 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=$db", $dbusername, $dbpassword); 

    $query = "SELECT * FROM users WHERE usern = ? AND passw = ?"; 
    $sth=$dbh->prepare($sql); 
    $sth->execute(array($_POST['username'], md5($_POST['password'])); 
    $result = $sth->fetch(); 
} 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
    exit; 
} 

PDOは、ユーザー名とパスワードなどの分野のためのBest way to stop SQL Injection in PHP

0

だけ1のシンプルなソリューションを使用するパラメータです使用されたSQLコマンド文字列が解析され、パラメータとは別にコンパイルされます。プリペアドステートメントを使用するのが最適です。

関連する問題