2009-04-23 18 views
2

オーケー、私は$ _POST変数から取得したデータに初期化されているPHPこのSQLクエリで何が問題になっていますか?

で二つの変数
$username; 
$password; 

:)

は、私は、このSQLクエリ

$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')"; 

を持っている。しかし、これはありません私には何も返されません。(

私は正しい方向に教えてもらえますか?

+8

これは、SQLインジェクションを招くことに注意してください。 –

答えて

12

(未テストコード、E & OE、など...)理由、それは動作しません。

+0

私はそれを見ませんでした。このようなセキュリティ上のリスクを抱えていることから、まだ衝撃を受けていた。しかし、これはおそらく最良の答えです。かっこを削除すると、コードは動作するはずですが、実稼働環境では使用しないでください。 –

4

eeek! 1つのSQLインジェクション!

EDIT:What's your favorite "programmer" cartoon?

+1

見ることなく、私はこれがリトルボビーテーブル漫画であると仮定します –

+0

コーデュントゥンド。 。 –

7

それと間違って何?

すべて、残念なことに特に、SQLインジェクション攻撃に対応しています。

これは慣例的な切り取りの場合です。&貼り付けの場合、実際には機能していない理由は後続の閉じ括弧です。おそらく、あなたはこれを呼び出すときにエラーをチェックしていないでしょうか?ベースのMySQL APIを使用して

それは次のようになります。

$sth = $db->prepare("SELECT COUNT(*) FROM users WHERE username = ? AND password = ?"); 
$sth->execute($username, $password); 
list($count) = $sth->fetchrow(); 
$authorized = ($count > 0); 

または類似のクエリが無いの終了に閉じ括弧があり

2

クエリの最後に浮遊するのはなぜですか?そこにはいけません。

ああ、SQLインジェクションでうまくいった。悪い。

1

クエリ文字列の末尾に余分な閉じ括弧があるようです。

[編集] - SQLインジェクション攻撃の叫び声:私たちは、ユーザーが変数でそれらを使用する前に何をしたのか分からない。どのように疑念の恩恵を受けるのですか? ;-)

+0

申し訳ありませんなど –

+0

彼に伝える方が良いと思っている方がいいでしょう。 –

+0

入力を検証するだけでなく、データがデータベースに渡されるときに、そのデータを常にサニタイズする必要があります。 – Matt

1

まずは、決して、のようにします。 SQL injectionについて読んでください、そして、それがあなたが言うことを理解するまで、どんなSQLも書かないでください。申し訳ありませんが、これは本当に重要です。

つまり、クエリには閉じ括弧が含まれています。構文エラーのように見えます。それを実行する際にエラーが発生しますか?

1

クエリの右側に余分な括弧があります。

また、コードを正しくサニタイズしないと、SQLインジェクションに脆弱になります。実際にはパラメータ化されたクエリを使用する必要がありますが、その代わりに少なくともを$username$passwordに使用してください。

また、ゴーストデバッグの一部として、パスワードを平文で保存しないでください。データベースにMD5ハッシュされている可能性が非常に高いです。

試してみてください。他のすべての問題に加えて

$username = mysql_real_escape_string($_POST["username"]); 
$password = md5($_POST["password"]); 

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; 
+0

MySQLは完全に優れたMD5()関数を持っています... – Alnitak

+1

私はそれを自動的に適用して覚えていません –

0

は指摘しました。ユーザーテーブルのパスワードは暗号化されて保存されます。 MySQLパスワードの暗号化ツールを使用してパスワードを実行していない限り、パスワードが一致しないため、このクエリのデータは表示されません。

+0

パスワードがどのように格納されているかをどのように推測できますか?彼のデータベーススキーマで? –

関連する問題