1

以下のコードは php で書かれています。

$user = addslashes($_POST['user']);
$pwd = addslashes($_POST['pwd']);

$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";

その後、クエリは mysql に送信されます。

ご指摘ください。

4

4 に答える 4

6

いいえ、安全ではありません。少なくとも次を使用mysql_real_escape_stringしてください。

$user = mysql_real_escape_string($_POST['user']);
$pwd = mysql_real_escape_string($_POST['pwd']);

セキュリティを強化するには、準備済みステートメントを使用してください。

最良のオプション:

どちらを選択するかを尋ねることができます。チェックアウトしてください:

于 2012-06-17T17:20:04.413 に答える
5

いいえ。

その理由は、一重引用符'は SQL クエリを壊す唯一の文字ではありませんが、によってエスケープされる唯一の文字であるためaddslashes()です。

ベター: 使用mysql_real_escape_string

$user = mysql_real_escape_string($_POST['user'], $conn);
$pwd = mysql_real_escape_string($_POST['pwd'], $conn);

$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";

ベスト: PDO と準備済みステートメントを使用する

$stmt = $dbh->prepare("SELECT * FROM userdata WHERE UserName=':user' AND Password=PASSWORD(':pass')");
$stmt->bindParam(':user', $user);
$stmt->bindParam(':pass', $pass);
于 2012-06-17T17:19:51.260 に答える
3

いいえ。データをエスケープするために使用しないでください。それは何年addslashes()もの間時代遅れです。次のいずれかである必要があります。

さらに、MySQL のPassword()機能を使用することも実用的ではありません。ソルトでハッシュを使用します。Bcrypt は私のお勧めです。また、 PHPassもチェックしてください。

于 2012-06-17T17:20:34.380 に答える
2

SQL インジェクションからの保護は簡単です。

データをフィルタリングします。

これは強調しすぎることはありません。適切なデータ フィルタリングを実施すると、ほとんどのセキュリティ上の懸念が緩和され、一部は実質的に解消されます。

あなたのデータを引用します。

データベースで許可されている場合 (MySQL では許可されています)、データ型に関係なく、SQL ステートメント内のすべての値を一重引用符で囲みます。

データをエスケープします。

有効なデータが意図せずに SQL ステートメント自体の形式に干渉する場合があります。mysql_escape_string()または特定のデータベースにネイティブなエスケープ関数を使用します。特定のものがない場合addslashes()は、良い最後の手段です。

詳細: http://phpsec.org/projects/guide/3.html#3.2

于 2012-06-17T17:52:22.400 に答える