3

以前はMySQLを使用していましたが、安全ではないと言われたので、管理者ログインパネルをPDOに再コーディングしました。これは、ここや他のフォーラムのユーザーが挿入できないと言っています。しかし、ハッカーはまだ侵入しています...ログイン後にページを編集し、ハッキングされた人に私が何を置いたかを教えてくれと言ったところ、ハッカーは私に言った...

コードが安全かどうかを知る必要があります。彼はSQLを介して侵入していると私に言っています。

そこで、最初にIPをセッションに保存したので、IPが変更された場合は、ログアウト(またはユーザー名)されます。

if ( isset($_SESSION['last_ip']) == false )
{
    $_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR'];
}
if ( $_SESSION['last_ip'] !== $_SERVER['REMOTE_ADDR'] )
{
    session_unset();
    session_destroy();
}

次に、私のログインは次のとおりです。

session_start();
include 'functions/functions.php';  
$db = mysqlconnect();
$password = md5($_POST['mypassword']);
$mod = 1; 
$statement = $db->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$statement->execute(array($_POST['myusername'],$password));
$result = $statement->fetchObject()->mod;
$count = $statement->rowCount();
if ( $result == 1 ) {
    $db = mysqlconnect();
    // Register $myusername, $mypassword and redirect to file "login_success.php"
    $_SESSION['user'] = $_POST['myusername'] ;
    //Test if it is a shared client
    if ( !empty($_SERVER['HTTP_CLIENT_IP']) ) {
        $ip=$_SERVER['HTTP_CLIENT_IP'];
        //Is it a proxy address
    } elseif ( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
        $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        $ip=$_SERVER['REMOTE_ADDR'];
    }
    $sqll = "UPDATE users SET lastip=? WHERE username=?";
    $q = $db->prepare($sqll);
    $q->execute(array($ip,$_SESSION['username']));
    $_SESSION['user'] = $_POST['myusername'] ;
    $sqlll = "INSERT INTO user_log (username,ip) VALUES (?, ?)";
    $qq = $db->prepare($sqlll);
    $qq->execute(array($_SESSION['username'],$ip));
    header("Location: home.php");
} else {
    echo "Wrong Username or Password";
}

コードを挿入できますか?

そして、これは私のhome.phpページであり、ユーザーがそれを表示できないようにします。

/// My conenct is here                    
$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";
$result = mysql_query($sql) or die(mysql_error());
$values = mysql_fetch_array($result);


if( isset($_SESSION['user']) ) {

} else {
    echo "Bye Bye";
    die;
}

if ( $values['mod'] == 1 ) {    
    echo "welcome";  
} else {
    echo"Your account has been reported for hacking";
    die;
}
4

2 に答える 2

1

あなたが表示するクエリがあなたが使用する唯一のクエリであると仮定すると、ハッカーが彼をブロックすると思ったまさにそのコードをどのように使用するかは面白いです. IT の世界では、フロント ドアは 3 重にロックされていますが、バックドアは開いていることがよくあります。この場合、それは裏口ではなく、侵入者に開かれていないかどうかを確認するために使用するドアの小さな窓です。

すべてのクエリで準備済みステートメントと変数バインディングを使用します。

それが一般的なルールです。「すべてのクエリ」の「すべて」を忘れただけです。

あなたの声明:

$sql = "SELECT * FROM users WHERE username='$_SESSION[user]'";

開いているウィンドウです。ハッカーがセッション データのユーザー名を偽装したことは明らかです。簡単な解決策は次のとおりです。

  1. ユーザー名または外部から受け取ったデータ ($_SESSION、$_POST、一部の $_SERVER など) は、何かを行う前に検証してください。データベースとの対話を実行する前に確認してください。
  2. 他のクエリで行ったように、変数バインディングを使用します。

この場合、タグを削除したり mysql_real_escape_string を使用したりする価値は低くなります。

ちなみに、変数バインディングを使用するために PDO を使用する必要はありません。mysqlでも完全に可能です。

$verbLok = mysqli_connect(Iam, not, gonna, tellyou);
$result = array();
if (($stmtLok = $verbLok->prepare( "SELECT * FROM users WHERE username = ?  limit 1")))
{        
    $stmtLok->bind_param("s", $_SESSION[user]);
    $stmtLok->execute();
    $result = $stmtLok->get_result();
    $stmtLok->close();
}
mysqli_close($verbLok);

あなたのためにトリックを行う必要があります。$result は、結果行の配列を保持します。私はもう従来のクエリにあまり慣れていませんが、覚えている限り、あなたのコードに似ています。

クエリで SQL コード インジェクション攻撃がどのように可能になるかについての興味深い読み物は、このページにあります。

于 2013-09-16T23:40:49.183 に答える
-1

適切な SQL インジェクションの防止策は、評価中に SQL コマンドを終了して新しいコマンドを開始するために使用できるすべてのテキストをエスケープすることです。

これを行うには、入力内の引用符をエスケープし、より適切な SQL を使用する必要があります — フィールドとテーブル名の前後にバッククォートを使用し、コード以外のテキストを囲むために引用符を使用するなど。

SELECT * FROM `users` WHERE `id` = '1'

次に、すべての引用符を でエスケープするmysql_real_escape_stringか、手動で #039 に置き換えます。など、また、HTML をエスケープして他のものを台無しにしないようにするために、etc を使用しますhtmlentities

于 2012-05-28T20:41:48.633 に答える