-1

この問題は修正されましたが、SQL の脆弱性を修正しようとしてエラーが発生し、最初からやり直しました。この問題で再び立ち往生し、何をすべきかまったくわかりません。助けてください。

<? 
ob_start();
include 'easygpt_config.php';
ob_end_clean();
if(isset($_POST['login'])){
$username= trim($_POST['username']);
$password = trim($_POST['password']);
if($username == NULL OR $password == NULL){
$final_report.="Please complete both fields";
$check_user_data = mysql_query("SELECT * FROM `members` WHERE `username` = '$username'") or die(mysql_error());
}else{
if(mysql_num_rows($check_user_data) == 0){ 
$final_report.="This username does not exist";
}else{
$get_user_data = mysql_fetch_array($check_user_data) or die("A MySQL error has occurred.<br />Your Query: " . $your_query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
if($get_user_data['password'] == $password){
$start_idsess = $_SESSION['username'] = "".$get_user_data['username']."";
$start_passsess = $_SESSION['password'] = "".$get_user_data['password']."";
$final_report.="<meta http-equiv='Refresh' content='0; URL=http://www.google.com>";
}}}}

if(isset($_SESSION['username']) && isset($_SESSION['password'])){ 
    }

?> 

エラーの原因としてリストされている行は、次で構成される行 12 です。

if(mysql_num_rows($check_user_data) == 0){
4

1 に答える 1

0

Explosion Pillsがすでに指摘しているように、いくつかの標準的なインデントだけで、何が起こっているのかが非常に明確になります。

<?
ob_start();
include 'easygpt_config.php';
ob_end_clean();
if (isset($_POST['login'])) {
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
    if ($username == NULL OR $password == NULL) {
        $final_report .= "Please complete both fields";
        $check_user_data = mysql_query("SELECT * FROM `members` WHERE `username` = '$username'") or die(mysql_error());
    } else {
        if (mysql_num_rows($check_user_data) == 0) {
            $final_report .= "This username does not exist";
        } else {
            $get_user_data = mysql_fetch_array($check_user_data) or die("A MySQL error has occurred.<br />Your Query: " . $your_query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
            if ($get_user_data['password'] == $password) {
                $start_idsess   = $_SESSION['username'] = "" . $get_user_data['username'] . "";
                $start_passsess = $_SESSION['password'] = "" . $get_user_data['password'] . "";
                $final_report .= "<meta http-equiv='Refresh' content='0; URL=http://www.google.com>";
            }
        }
    }
}
if (isset($_SESSION['username']) && isset($_SESSION['password'])) {
}
?>  

ブロックでクエリを実行し(したがって設定し$check_user_data)、ifブロックでテストしelseます。

将来、この種の混乱を避けたいですか?コードを手動でインデントするか、その雑用を処理できる数百万のコードエディターの1つを入手してください。または、多くのオンラインプリティプリンティングサービス([beta.phpformatter.com]など)(http://beta.phpformatter.com/)のいずれかを使用します。

最後になりましたが、非推奨のmysql_関数の使用を停止してください。非推奨は、とりわけ、新しいコードでそれらを使用して はならないことを意味します。

また、最新のmysqli_後継者を忘れて、すぐにPDOにスキップすることをお勧めします。これは最新の適切に設計されたAPIであり、複数のデータベースエンジンで使用できます。最後に、プリペアドステートメントの操作が簡単になります。ステートメントは、おそらく最も安価ですが、SQLインジェクションに対する最も効果的な防御です。

于 2013-02-10T00:44:05.010 に答える