0

mysql_real_escape_string は、無効な文字を含むサニタイズされていないフィールドがデータベースに追加されるのを防ぎます。各フォームですべてのフィールドを指定する必要はありません (フィールドごとに行うのは面倒であり、人々が含める可能性のある特殊文字やタイプミスに対応していないため) が、現時点では、このコードは何もできないようにします。サニタイズされていないフィールドに脅迫的な文字が存在する場合に挿入されますが、それでも次のページに進みます。

このページでは jQuery 検証も使用していますが、それを使用して SQL インジェクションを防ぐことはできませんでした。

   function clean($str) {
     $str = @trim($str);
     if(get_magic_quotes_gpc()) {
     $str = stripslashes($str);
     }
     return mysql_real_escape_string($str);
   }

//Sanitize the POST values
   $user_name = clean($_POST['user_name']);
   $password = clean($_POST['password']);

//Create INSERT query
   $qry = "INSERT INTO customer_info(fname, lname, gender, zip, email, phone, terms, security_question, security_answer, participating_retailers, notify_new_items, notify_promotions, priority1, priority2, priority3, priority4, priority5, privacy, user_name, password) 
 VALUES('$_POST[fname]','$_POST[lname]','$_POST[gender]','$_POST[zip]','$_POST[email]','$_POST[phone]','$_POST[terms]','$_POST[security_question]','$_POST[security_answer]','$_POST[participating_retailers]','$_POST[notify_new_items]','$_POST[notify_promotions]','$_POST[priority1]','$_POST[priority2]','$_POST[priority3]','$_POST[priority4]','$_POST[priority5]','$_POST[privacy]','$user_name','$password')";
   $result = @mysql_query($qry);  


  $qry="SELECT * FROM customer_info WHERE user_name='$user_name' AND password='$password'";  
  $result=mysql_query($qry);            
  session_regenerate_id();
        $member = mysql_fetch_assoc($result);
        $_SESSION['SESS_USER_ID'] = $member['user_id'];
        $_SESSION['SESS_FIRST_NAME'] = $member['fname'];
        $_SESSION['SESS_LAST_NAME'] = $member['lname'];
        session_write_close();
        header("location: flatter-form.html");
        exit();       
4

1 に答える 1

0

mysql_query廃止されました。PDOまたはmysqli両方が SQL インジェクションに対するセキュリティを提供します。両方ともエスケープ機能に加えてPDO、文字列を引用する機能もあります。準備済みのパラメーター化されたクエリを使用すると、攻撃者が SQL を挿入することはほとんど不可能になります。

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array(':name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}

サンプル:準備されたステートメント

PDO vs. MySQLiを見てください。

于 2012-08-23T17:53:19.860 に答える