0

私は次のログインスクリプトを持っています。安全を確保するために最善を尽くしましたが、スクリプトをハッキングしてログインできたというメールを送ってくれた人がいて、管理者パスワードなどのデータベース情報も送ってくれました。

login.php

<?
@session_start();
include("../global.inc.php");

if(isset($_POST['submit']))
{

    include("../classes/class.admin.php");  
    $objAdmin = new admin();
    $verifyAdmin=$objAdmin->verifyAdmin(mysql_real_escape_string($_POST['username']),(mysql_real_escape_string($_POST['password'])));


    if($verifyAdmin==1)
    {
        $_SESSION['my_admin']="admin";
        header("location:index.php");
    }
    else
    {
        $errMsg="Invalid Username or Password.";
    }
}
?>

<form name="frm" method="post" action="">
  <table width="300" border="0" cellspacing="0" cellpadding="0">

    <tr>
        <td class="blackheader" > Admin Panel</td>
      </tr>
    <tr>
        <td valign="top" class="adminborder"><table width="100%" border="0" cellspacing="0" cellpadding="0">
                                <tr>
        <td>&nbsp;</td>
        <td style="color:#FF0000; font-size:11px; font-family:Arial, Helvetica, sans-serif;"><?=$errMsg;?></td>
    </tr>
        <tr>
            <td width="31%" height="28" align="left" valign="middle" class="admintxt">Username:</td>
            <td><input type="text" name="username" class="txtfield1" size="28"></td>
        </tr>
        <tr>
            <td height="28" align="left" valign="middle" class="admintxt">Password:</td>
            <td><input type="password" name="password" class="txtfield1" size="28"></td>
        </tr>
        <tr>
            <td></td>
            <td height="22" align="left" valign="middle"><input type="submit" name="submit" value="Login" class="submit_button">

ユーザーがログインしているかどうかを確認するために、ヘッダーファイルに次のコードがあります

<?php
session_start();
if(!isset($_SESSION['my_admin']))
{
    header("location: login.php");
}
?>

以下は、管理者ログインパスワードを確認するためのクラスです。

class admin extends dbClass
{
    function verifyAdmin($username, $password)
    {
        $select="select username,password from ".TABLE_ADMIN." where username='".$username."' and password='".$password."'";
        $query=$this->query($select,1);
        $numRows=count($query);

        return $numRows;
    }

}
4

2 に答える 2

2
  1. パラメータ化されたステートメントを使用してクエリを実行し、SQL インジェクションを回避します。
  2. この男が実際に他のセキュリティ ホールを介してサーバーに直接アクセスしていないことを確認してください。
于 2012-11-11T07:51:09.957 に答える
2

まず、コードを PDO に切り替えてから、クエリの準備/実行を使用します。これにより、注射を防ぐことができます。

また、ファイルへのアクセスを防ぐために、.htaccess が正しく設定されていることを確認してください。

于 2012-11-11T07:52:26.780 に答える