-2

サーバー側でPHPを使用し、データベースとしてmysqlを使用するWebサイトがあります。次のスクリプトを使用して、データベースからデータを取得します。このコードがインジェクション攻撃に対して脆弱かどうか誰か教えてください。もしよろしければ解決策を教えていただけないでしょうか?

<?php
// PHP script 

$usrname=$_POST['usrname'];
$_SESSION['usremail']=$usrname;
$usrpassword=$_POST['passwd']; 
$db=mysql_select_db('mydb',$connection);
$result=mysql_query("select usrfname,usrlname from userinformation where usremail='$usrname' and usrpassword='$usrpassword'") or die('failed to login');

どんな助けでも大歓迎です。

ありがとう

4

5 に答える 5

6

はい、脆弱です。ユーザー入力から直接値を話し、それをクエリに配置しています。

を参照するmysql_real_escape_stringか、(できれば) パラメータ化されたクエリを提供する MySQLi を使用する必要があります。SQL インジェクションは、ユーザー データがデータではなく SQL コードとして挿入されることによって発生します。クエリを保護する唯一の真の方法は、パラメーター化されたクエリを使用することです。これは、プロトコル レベルでデータとクエリ テキストを分離します。

さらに、パスワードは平文で保存されます。絶対的な最小値としてソルト付きハッシュ関数を使用する必要があります。

次のすばらしい質問もご覧ください。

于 2012-04-28T17:33:44.490 に答える
4

もちろん脆弱です。入力をサニタイズすることはありません。mysql_* 関数は非推奨ですが、引き続きこのmysql_real_escape_string関数を使用できます。それを変数に適用するだけです。

$usrname = mysql_real_escape_string($_POST['usrname']);
$usrpassword = mysql_real_escape_string($_POST['passwd']);
于 2012-04-28T17:33:09.737 に答える
2

うん、それは..

代わりにこれを行います:

$usrname=$_POST['usrname'];
$_SESSION['usremail']=$usrname;
$usrname=mysql_real_escape_string($usrname);
$usrpassword=mysql_real_escape_string($_POST['passwd']); 
$db=mysql_select_db('mydb',$connection);
$result=mysql_query("select usrfname,usrlname from userinformation where usremail='$usrname' and usrpassword='$usrpassword'") or die('failed to login');`

プリペアド ステートメントも調べる必要があります。

于 2012-04-28T17:33:46.410 に答える
1

クエリで使用mysql_real_escape_string()するユーザー生成文字列で使用します。

$usrname     = mysql_real_escape_string($_POST['usrname']);
$usrpassword = mysql_real_escape_string($_POST['passwd']); 

$db=mysql_select_db('mydb',$connection);
$result = mysql_query("SELECT usrfname, usrlname FROM userinformation WHERE usremail='$usrname' AND usrpassword='$usrpassword'") or die('failed to login');

// Set session data only if login is successful 
$_SESSION['usremail']=$usrname;
于 2012-04-28T17:38:47.073 に答える
0

はい、ユーザー入力 (フォームから (POST データ)、URL の一部として (GET データ)、または Cookie でさえも) を最初に確認せずに受け入れてはなりません。たとえば、ユーザー名は to z おそらくドットが許可されている. したがって、入力テキストをデータベースに近づける前に、それがすべて含まれていることを確認します. Google preg_match.

また、サーバー側で行う必要があり、ブラウザで JavaScript を使用するだけでは十分ではありません。

また、パスワードをユーザーがサインアップ時に入力したものの md5 ハッシュとして保存するので、サインアップ時に $password を取得し、文字の範囲が制限されていることを確認し、$hass_pw=md5($password) を実行して保存します。 d/b の $hash_pw。次に、ユーザーがログインすると、それを再度ハッシュしてクエリで使用します。(ここではわかりやすくするために $_POST を省略しました)。

例えば:

if preg_match(/"[^a-z]/i", $_POST['usrname'])
    print "bad username format)
else    
    {
    // good format username, safe to use in query
    }
于 2012-04-28T17:41:58.603 に答える