質問
<?php
class test_class {
public function __construct() {
}
public function doLogin($username,$password) {
include("connection.php");
$query = "SELECT *
FROM users
WHERE username = '".mysql_escape_string($username)."'
AND password = '".mysql_escape_string($password)."'";
$result = mysql_fetch_array(mysql_query($query));
if(!$result) {
return 'no';
}
else
{
return 'yes';
}
}
}
?>
上記のコードは動作しますが、その安全なかどうか少し心配しています。
注:私は、POSTメソッドを使用していないので、私は、関数で引数としてそれを受け取るために持っていると私は使用することはできません。
if (isset($_POST['username']) && isset($_POST['password']))
{
$username= $_POST['username'];
$password= $_POST['password'];
解決
コードは、安全かもしれないが、実装は素晴らしいではありません。 のあなたは、プレーンテキストとして認証パスワードを保存することはありません。ののあなたはそれを塩とハッシュする必要があります。
私は理由を説明する時間を過ごすことができますが、あなたはより良いだけ読んでこれを行うだろうのます。
他のヒント
クエリ自体は安全な表示されますが、あなたは、このようなPDOやZend_Dbのように、パラメータバインディングをサポートするDBインタフェースを使用した場合、あなたはそれほど神経質にすべてのSQL文を精査する必要はないでしょう。
また、はmysql- *関数はほとんど廃止されました。あなたの代わりにmysqli- *関数になっているはずです。
は、文体の注意点として、空のコンストラクタにはポイントがない、と私は文字列値ではなく、ブール値trueまたはfalseを返すことをお勧めしたい。
他の場所で述べたように、最後に、平文パスワードを格納することは悪い考えです。
うう....あなたは、プレーンテキストのパスワードを保存していますか?それは最も確かに安全ではありません。パスワードは、SHA256のようなものを使用して、塩でハッシュ化されなければなりません。平文パスワードを格納することは良いアイデアになることはありません。
はありません。あなたは、データベース内の生のパスワードを保存するべきではありません。それは(好ましくは塩と)ハッシュ化され保管してください。さらに、プリペアドステートメントは、エスケープより良い選択です。この PHP PDOのドキュメントを参照してください。 (セキュリティに加えて)追加の利点として、それらは、より効率的であることができる。
コード自体は大丈夫に見えますが、私が見る主な問題は、あなたがテキストの周りのパスワードを渡しているということです。
クライアントからサーバへの接続が安全(すなわち、SSLを使用して)です サーバとデータベースの接続がセキュアである
いずれの場合には、誰かがワイヤーの上に座るとによって行くトラフィックを見ることができる場合は、、その後、あなたはセキュリティ上の問題を持っています。
それは私だったら、私は間違いなく、クライアント&サーバー間のSSL接続を持っていると思います。
私は、データベース内のパスワードのハッシュを格納したことを確認してくださいと思います。
私は
のようなものにコードを変更したいです//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
//Valid
私はそれが私がセキュリティ心配ならば、私は変数に「ユーザー名」のパスワードを保存し、クエリの外のそれを比較したい、しかし、OKだと思います。