このphpコードはどれほど危険ですか?それについて何ができるでしょうか?
$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
このphpコードはどれほど危険ですか?それについて何ができるでしょうか?
$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
考えられる問題:
SQLステートメントに問題がある可能性があります。SQLインジェクションのために自分自身を開いたままにしておくことは悪い習慣です。
SQLインジェクションが悪いです。私を信じて。
$ userをHTMLページに表示したい場合は、次のようなコマンドを入力してレイアウトを「ハッキング」する機能を含めたくない場合があります。
<H1>HI MOM</H1>
また、パスワードをプレーンテキストで保存しないでください(良いキャッチcagcowboy!)。それはあなたのデータベースを管理する(またはハッキングする)人々にあまりにも多くの力を与えます。誰かのパスワードを知る必要はありません。
次のような戦術を試してください。
// mostly pulled from http://snippets.dzone.com/posts/show/2738
function MakeSafe($unsafestring)
{
$unsafestring= htmlentities($unsafestring, ENT_QUOTES);
if (get_magic_quotes_gpc())
{
$unsafestring= stripslashes($unsafestring);
}
$unsafestring= mysql_real_escape_string(trim($unsafestring));
$unsafestring= strip_tags($unsafestring);
$unsafestring= str_replace("\r\n", "", $unsafestring);
return $unsafestring;
}
// Call a function to make sure the variables you are
// pulling in are not able to inject sql into your
// sql statement causing massive doom and destruction.
$name = MakeSafe( $_POST["user"] );
$pwd = MakeSafe( $_POST["pwd"] );
// As suggested by cagcowboy:
// You should NEVER store passwords decrypted.
// Ever.
// sha1 creates a hash of your password
// pack helps to shrink your hash
// base64_encode turns it into base64
$pwd = base64_encode(pack("H*",sha1($pwd)))
これは危険です:
SQLインジェクションはさておき、パスワードがプレーンテキストで保存されているようですが、これはすばらしいことではありません。
$query を SQL データベースに渡さなければ、このコードは非常に安全です。
0';drop table users;--
名前を投稿する場合
あなたのコマンドは
select name, pwd form users where name='0';
drop table users; --'and pwd = '[VALUE OF PWD]'
したがって、最初にデータを取得し、次に users テーブルを削除し、残りはコメントであるため何もしません。
PHP の特定の mysql コマンドは、sql を渡すと複数のクエリを実行します。これを回避する最善の方法は、パラメーター化されたクエリです。
私はすべての DB アクセスに PDO を使用しており、強くお勧めします。頭のてっぺんにリンクはありませんが、使用したチュートリアルが Google を上回ったことを覚えています。
SQL インジェクションが発生しやすいだけでなく、インジェクションが意図されていない場合でも失敗します。
たとえば、ユーザーが「ギョーム・フランソワ・アントワーヌ、マルキ・ド・ロスピタル」という名前を希望しているとします。ユーザー名には引用符が含まれており、それをエスケープしていないため、ユーザーはシステムを壊したくありませんが、クエリは失敗します!
PDOを使用するか、次のようにします。
$query = sprintf(
"SELECT 1 FROM users WHERE name = '%s' AND password = '%s'",
mysql_real_escape_string($_POST['name']),
mysql_real_escape_string(md5($_POST['password']))
);
信じられないかもしれませんが、これは安全です...magic_quotes_gpc
がオンになっている場合。これは PHP6 には決してないため、それ以前に修正することをお勧めします。
$_POST['user'] = "' or 1=1; --";
誰でもあなたのアプリにすぐにアクセスできます
$_POST['user'] = "'; DROP TABLE user; --";
(有料?)ユーザーリストに別れを告げる
後で出力に$nameをエコーすると、XSSインジェクション攻撃が発生する可能性があります
:O決してそれをしないでください、これはSQLInjection攻撃を引き起こす可能性があります。たとえば、ユーザーがなんらかの方法で入力した場合: 'テーブルusersを削除します-- $usernameの入力として; このコードは元のコードに連結され、テーブルを削除します。ハッカーはさらに多くのことを実行し、Webサイトをハッキングする可能性があります。
これは通常、非常に危険です。場合によっては、データベースのアクセス許可によって軽減できます。
入力($nameと$pwd)を検証しません。ユーザーは、これらのフィールドの一方または両方でSQLを送信できます。SQLは、データベース内の他のデータを削除または変更する可能性があります。
非常に危険です。パスワードについては、パスワードを MD5 ハッシュに変換し、それをユーザーの「パスワード」として保存することをお勧めします。
1) ユーザーがパスワードを盗まれるのを防ぐ 2) ユーザーが悪意のある文字列を書き込むと、エントリ/テーブル/データベースが消去される可能性があります
また、名前に基本的な一致正規表現を実行して、A-Za-z0-9 といくつかのアクセント付き文字 (特殊文字、*、<、> は特に使用しない) のみを使用するようにする必要があります。 .
安全ではありません。PDO などを調べてみてください。 PHP PDO
ユーザー データが SQL クエリに含まれる場合は、常に でデータをサナタイズしますmysql_real_escape_string
。
さらに、パスワード自体ではなく、パスワードのソルト ハッシュのみを保存する必要があります。次の関数を使用して、ランダムなソルト値を持つソルト付きハッシュを生成およびチェックできます。
function saltedHash($data, $hash=null)
{
if (is_null($hash)) {
$salt = substr(md5(uniqid(rand())), 0, 8);
} else {
$salt = substr($hash, 0, 8);
}
$h = $salt.md5($salt.$data);
if (!is_null($hash)) {
return $h === $hash;
}
return $h;
}
すべて一緒に:
$query = 'SELECT pwd FROM users WHERE name = "'.mysql_real_escape_string($_POST['user']).'"';
$res = mysql_query($query);
if (mysql_num_rows($res)) {
$row = mysql_fetch_assoc($res);
if (saltedHash($_POST["pwd"], $row['pwd'])) {
// authentic
} else {
// incorrect password
}
} else {
// incorrect username
}