0

私はこの検証コードを持っています:

<?php

$con=mysql_connect("localhost","root","");
mysql_select_db("nnx",$con);

$tbl=mysql_query("SELECT * FROM tablename");
while($row=mysql_fetch_array($tbl))
{

    $name=$_POST['name'];
    $lname=$_POST['lname'];
    $add=$_POST['add'];
    $age=$_POST['age'];
    $contact=$_POST['contact'];
    $email=$_POST['email'];
    $user=$_POST['user'];
    $pass=$_POST['pass'];

   if(($name!="")&&($lname!="")&&($add!="")&&($age!="")&&($contact!="")&& ($email!="")&&($user!="")&&($pass!=""))
   {
      if ($_POST['user']==$row['username'])
      {
            header("location: /register.php?codeErr2=1");

      }

      else
      {
      $value=mysql_query("INSERT INTO tablename(name, lastname, address, age, contact,email, username, password) VALUES ('".$_POST['name']."','".$_POST['lname']."','".$_POST['add']."','".$_POST['age']."','".$_POST['contact']."','".$_POST['email']."','".$_POST['user']."','".$_POST['pass']."')");
  }
   }
   else 
   {
 header("location: /register.php?codeErr=1");
   }
}

この検証は私の登録フォーム用です。すべてのフィールドが入力されている場合、ユーザーが入力したユーザー名がデータベースに既に存在するかどうかがチェックされます。そうでない場合は、エラー メッセージが表示されます。ユーザー名がすでにデータベースにある場合は、エラー メッセージが出力されます。それ以外の場合は、次のページに進み、すべての値がデータベースに挿入されます。問題は、データベースに既に存在するユーザー名を入力するたびに、ユーザー名が引き続き受け入れられることです。検証コードに問題はありません。ここで考えられる問題を誰かが教えてくれますか? 前もって感謝します。:)

4

2 に答える 2

1

ユーザー名を確認し、リダイレクト後に終了する必要があります。

$tbl=mysql_query("SELECT * FROM tablename WHERE `username` = '".mysql_real_escape_string($_POST['user'])."'");
$row = mysql_fetch_assoc($tbl);
if ($_POST['user'] == $row['username']){
    header("location: /register.php?codeErr2=1");
    die;
}

あなたのコードはSQLインジェクションに対して脆弱です:

$con=mysql_connect("localhost","root","");
mysql_select_db("nnx",$con);

$tbl=mysql_query("SELECT * FROM tablename WHERE `username` = '".mysql_real_escape_string($_POST['user'])."'");
$row = mysql_fetch_assoc($tbl);
if ($_POST['user'] == $row['username']){
    header("location: /register.php?codeErr2=1");
    die;
}

$name= $_POST['name'];
$lname= $_POST['lname'];
$add = $_POST['add'];
$age = $_POST['age'];
$contact = $_POST['contact'];
$email = $_POST['email'];
$user = $_POST['user'];
$pass = $_POST['pass'];

if(($name!="") && ($lname!="") && ($add!="") && ($age!="") && ($contact!="") && ($email!="") && ($user!="") && ($pass!="")){
    $value=mysql_query("INSERT INTO tablename(name, lastname, address, age, contact, email, username, password)
    VALUES 
    ('".mysql_real_escape_string($name)."','".mysql_real_escape_string($lname)."','".mysql_real_escape_string($add)."','".mysql_real_escape_string($age)."',
    '".mysql_real_escape_string($contact)."','".mysql_real_escape_string($email)."','".mysql_real_escape_string($user)."',
    '".mysql_real_escape_string($pass)."')");
} else {
    header("location: /register.php?codeErr=1");
    die;
}

mysql_*補足として、関数は非推奨になっ ているため、PDOまたはMySQLiに移行する必要があります。これは素晴らしいチュートリアルであり、例は次のとおりです

$db = new PDO('mysql:host=localhost;dbname=nnx;charset=UTF-8', 'root', '', array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))

$stmt = $db->prepare("SELECT * FROM `tablename` WHERE `username` = :username");
$stmt->execute(array(':username' => $_POST['user']));
$row_count = $stmt->rowCount();
if($row_count){
    header("location: /register.php?codeErr2=1");
    die;
}

if(($name!="") && ($lname!="") && ($add!="") && ($age!="") && ($contact!="") && ($email!="") && ($user!="") && ($pass!="")){
    $stmt = $db->prepare("INSERT INTO `tablename`(`name`, `lastname`, `address`, `age`, `contact`, `email`, `username`, `password`) VALUES (:name, :lname, :address, :age, :contact, :email, :username, :password)");
    $stmt->execute(array(':name' => $_POST['name'], ':lname' => $_POST['lname'], ':address' => $_POST['add'], ':age' => $_POST['age'], ':contact' => $_POST['contact'], ':email' => $_POST['email'], ':username' => $_POST['user'], ':password' => $_POST['pass']));
} else {
    header("location: /register.php?codeErr=1");
    die;
}

このようにして、SQLインジェクションは不要です。

于 2012-10-01T08:00:00.903 に答える
0
<?php

$con=mysql_connect("localhost","root","");
mysql_select_db("nnx",$con);

$name=$_POST['name'];
$lname=$_POST['lname'];
$add=$_POST['add'];
$age=$_POST['age'];
$contact=$_POST['contact'];
$email=$_POST['email'];
$user=$_POST['user'];
$pass=$_POST['pass'];

if(($name!="")&&($lname!="")&&($add!="")&&($age!="")&&($contact!="")&& ($email!="")&&($user!="")&&($pass!=""))
{
    $tbl=mysql_query("SELECT * FROM tablename where username = '{$user}'");
    $num_rows = mysql_num_rows($tbl);
    if($num_rows > 0){
        header("location: /register.php?codeErr2=1");
    } else {
        while($row=mysql_fetch_array($tbl))
        {
            $value=mysql_query("INSERT INTO tablename(name, lastname, address, age, contact,email, username, password) VALUES ('".$_POST['name']."','".$_POST['lname']."','".$_POST['add']."','".$_POST['age']."','".$_POST['contact']."','".$_POST['email']."','".$_POST['user']."','".$_POST['pass']."')");
        }
    }
} else {
    header("location: /register.php?codeErr=1");
}

?>
于 2012-10-01T09:06:46.180 に答える