以下のコードは php で書かれています。
$user = addslashes($_POST['user']);
$pwd = addslashes($_POST['pwd']);
$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";
その後、クエリは mysql に送信されます。
ご指摘ください。
以下のコードは php で書かれています。
$user = addslashes($_POST['user']);
$pwd = addslashes($_POST['pwd']);
$query = "SELECT * FROM userdata WHERE UserName='$user' AND Password=PASSWORD('$pwd')";
その後、クエリは mysql に送信されます。
ご指摘ください。
いいえ、安全ではありません。少なくとも次を使用mysql_real_escape_string
してください。
$user = mysql_real_escape_string($_POST['user']);
$pwd = mysql_real_escape_string($_POST['pwd']);
セキュリティを強化するには、準備済みステートメントを使用してください。
最良のオプション:
どちらを選択するかを尋ねることができます。チェックアウトしてください:
いいえ。
その理由は、一重引用符'
は 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);
いいえ。データをエスケープするために使用しないでください。それは何年addslashes()
もの間時代遅れです。次のいずれかである必要があります。
mysql_real_escape_string()
交換用として使用さらに、MySQL のPassword()
機能を使用することも実用的ではありません。ソルトでハッシュを使用します。Bcrypt は私のお勧めです。また、 PHPassもチェックしてください。
SQL インジェクションからの保護は簡単です。
データをフィルタリングします。
これは強調しすぎることはありません。適切なデータ フィルタリングを実施すると、ほとんどのセキュリティ上の懸念が緩和され、一部は実質的に解消されます。
あなたのデータを引用します。
データベースで許可されている場合 (MySQL では許可されています)、データ型に関係なく、SQL ステートメント内のすべての値を一重引用符で囲みます。
データをエスケープします。
有効なデータが意図せずに SQL ステートメント自体の形式に干渉する場合があります。mysql_escape_string()
または特定のデータベースにネイティブなエスケープ関数を使用します。特定のものがない場合addslashes()
は、良い最後の手段です。