3

このphpコードはどれほど危険ですか?それについて何ができるでしょうか?

$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
4

13 に答える 13

24

考えられる問題:

  1. SQLインジェクション
  2. XSSインジェクション(このコードが挿入クエリの場合、それは明確な問題になります)
  3. プレーンテキストのパスワード

SQLステートメントに問題がある可能性があります。SQLインジェクションのために自分自身を開いたままにしておくことは悪い習慣です。

SQLインジェクションが悪いです。私を信じて。

$ userをHTMLページに表示したい場合は、次のようなコマンドを入力してレイアウトを「ハッキング」する機能を含めたくない場合があります。

<H1>HI MOM</H1>

またはJavaScriptの束。

また、パスワードをプレーンテキストで保存しないでください(良いキャッチ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)))
于 2009-03-06T18:55:26.247 に答える
14

これは危険です: xkcd ボビー テーブル

于 2009-03-06T19:35:51.830 に答える
12

SQLインジェクションはさておき、パスワードがプレーンテキストで保存されているようですが、これはすばらしいことではありません。

于 2009-03-06T18:55:41.037 に答える
12

$query を SQL データベースに渡さなければ、このコードは非常に安全です。

于 2009-03-06T18:57:55.430 に答える
3

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 を上回ったことを覚えています。

于 2009-03-06T19:02:25.997 に答える
3

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']))
                 );

于 2009-03-06T19:03:23.157 に答える
2

信じられないかもしれませんが、これは安全です...magic_quotes_gpcがオンになっている場合。これは PHP6 には決してないため、それ以前に修正することをお勧めします。

于 2009-03-06T19:27:23.487 に答える
1
  1. $_POST['user'] = "' or 1=1; --"; 誰でもあなたのアプリにすぐにアクセスできます

  2. $_POST['user'] = "'; DROP TABLE user; --"; (有料?)ユーザーリストに別れを告げる

  3. 後で出力に$nameをエコーすると、XSSインジェクション攻撃が発生する可能性があります

于 2009-03-06T20:20:45.840 に答える
0

:O決してそれをしないでください、これはSQLInjection攻撃を引き起こす可能性があります。たとえば、ユーザーがなんらかの方法で入力した場合: 'テーブルusersを削除します-- $usernameの入力として; このコードは元のコードに連結され、テーブルを削除します。ハッカーはさらに多くのことを実行し、Webサイトをハッキングする可能性があります。

于 2009-03-06T18:55:43.127 に答える
0

これは通常、非常に危険です。場合によっては、データベースのアクセス許可によって軽減できます。

入力($nameと$pwd)を検証しません。ユーザーは、これらのフィールドの一方または両方でSQLを送信できます。SQLは、データベース内の他のデータを削除または変更する可能性があります。

于 2009-03-06T18:56:48.350 に答える
0

非常に危険です。パスワードについては、パスワードを MD5 ハッシュに変換し、それをユーザーの「パスワード」として保存することをお勧めします。
1) ユーザーがパスワードを盗まれるのを防ぐ 2) ユーザーが悪意のある文字列を書き込むと、エントリ/テーブル/データベースが消去される可能性があります

また、名前に基本的な一致正規表現を実行して、A-Za-z0-9 といくつかのアクセント付き文字 (特殊文字、*、<、> は特に使用しない) のみを使用するようにする必要があります。 .

于 2009-03-06T18:58:53.040 に答える
0

安全ではありません。PDO などを調べてみてください。 PHP PDO

于 2009-03-06T18:59:57.517 に答える
0

ユーザー データが 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
}
于 2009-03-06T19:35:02.533 に答える