私のコメントで述べたように、PDOまたはmysqliを使用して準備文を使用してください。誰かがちょうど$username
について
'; Select * from members where authLevel = "admin" limit 1 --
でこれを入れて、管理者としてログイン強打することができます。これは、クエリがなり、--
はその後何が無視されるので、コメントのMySQLの道は何かということですなぜ
SELECT * FROM members WHERE username=''; Select * from members where authLevel = "admin" limit 1 -- AND password='ababsdf'
です。基本的に私は、authLevelのadminを持つユーザーを選択し、1つの結果に制限するように指示しました。
UPDATE 2可能性がある答えについては、
を失敗したスペースでAdmin
またはADMIN
または[space]admin
と同じではありません。 PHPの文字列比較では大文字と小文字が区別されます。
この条件が満たされていないにもかかわらず、そこにある項目の一方または両方が真ではありません。あなたがしなければならないのはこれです。
echo 'NumRows: '.mysql_num_rows($result);
echo "<br>\n";
echo 'AuthLevel: '.$row->authlevel;
これを出力するだけで、かなり明白になるはずです。またAUTHLEVELのためにそのヘッダリダイレクション(あなたが他のページに追い出されません)
//header("location: login-failed.php"); -- un-comment when fixed.
をコメントアウトしますが、この
echo 'AuthLevel: ['.$row->authlevel.']';
なぜのようなブラケットでそれをラップすることをお勧めしますか?このような場合は
[ admin]
そこにスペースや何かがあることがわかります。それはあなたの状態でこれを行うには悪い考えではないでしょう
if(strtolower(trim($row->authlevel)) == 'admin' ...
PDOまたはmysqliのは)(あなたは塩が少なくともSHA256の暗号化を追加(またはpassword_hashを使用追加したいと思い、そのはるかに困難実際にではありません)基本的にはあなたのコードは、PHP7 mysql_のようなセキュリティ上の理由の上にこの
$dsn = 'mysql:host=127.0.0.1;dbname=members;';
$user = 'db_user';
$password = '*******';
try {
$DB = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
die('Connection failed: ' . $e->getMessage());
}
$qry="SELECT * FROM members WHERE username=:username"; ///(add field named salt, this is a random string)
//search only for username
///$DB is pdo database object
//prepare the sql, this 2 step process prevent sql injection by using a placeholder :username instead of the variable directly
$stmt = $DB->prepare($qry);
//execute the statement with variables
$stmt->execute(array(':username' => $username));
//retrieve the result row as an object.
$row = $stmt->fetch(PDO::FETCH_OBJ);
//Check whether the query was successful or not
if($stmt->rowCount() == 1) {
if($row->authlevel == "admin") { //if it's not an admin no need to check password
if(sha256($row->salt() . $password) == $row->password){
//Check password in php, db is case insensitive unless its a binary field.
//Login Successful (obviously youll want to update the member to account for a better password)
.....
}else{
header("location: login-failed.php"); //change for bad password etc.
}
} else {
//Login failed
header("location: login-failed.php"); //change for invalid user level (you do not have authorization to view this page ... etc.)
}
}else {
die("Query failed"); //change for username not found, or unknown username
}
http://php.net/manual/en/pdo.construct.php
http://php.net/manual/en/function.password-hash.php
ようになります。 *関数がなくなったので、それらを使うのに慣れていないのが最良です。
なぜパスワードを探しているのですか?ハッシュされていて、送信されていないのはなぜですか?そのようなユーザー名を見つけるなど、次に比較する。また、mysqlを使用しないでください。また、SQLに変数を入れてください。 – ArtisticPhoenix
''; *あなたのユーザー名のエントリであれば、あなたのログインシステムをハッキングしましたが、ここからauthLevel = "admin" limit 1 - 'を選択してください。ただ言って。 – ArtisticPhoenix
このSQLには非常に多くの間違いがあります。mysqliで適切なログインフォームを作成するためのチュートリアルにリンクすることはできますか? – Ctc