2017-12-13 6 views
-1

私のサインアップフォームのスニペットは、私がサービスにサインアップするときにユーザー情報を保存するために使いたいものです。ログイン時にファーストネームを表示したいので、ウェブブラウザで悪質なコードが実行される可能性があります。問題は、悪意のあるコードが入力に注入されるのを防ぐためにユーザー入力を保護する方法と、nodejで実行されているバックエンドに格納する方法は何ですか?あなたは私に例を教えてくれますか?ここで私の申し込みフォームはコードインジェクションに対して脆弱ですか?もしそうなら、それをどうすれば保護するのですか

はフォーム

<div class="tab-form"> 
     <div id="signup"> 
     <h1>Sign up for the <span>Beta</span></h1> 
     <form action="/signup" method="post"> 
     <div class="top-row"> 
      <div class="field-wrap"> 
      <label>First Name<span class="req">*</span></label> 
      <input type="text" name="f_Name" required autocomplete="off" /> 
      </div> 
      <div class="field-wrap"> 
      <label>Last Name<span class="req">*</span></label> 
      <input type="text" name="l_Name" required autocomplete="off"/> 
      </div> 
     </div> 
     <div class="field-wrap"> 
      <label>Email<span class="req">*</span></label> 
      <input type="email" name="email" size="64" maxlength="64" required autocomplete="off"/> 
     </div> 
     <div class="field-wrap"> 
      <label>Address<span class="req">*</span></label> 
      <input type="text" name="address" required autocomplete="off"/> 
     </div> 
     <div class="field-wrap"> 
      <label>Address 2</label> 
      <input type="text" name="address_2"/> 
     </div> 
     <div class="field-wrap"> 
      <label>City<span class="req">*</span></label> 
      <input type="text" name="city" required autocomplete="off"/> 
     </div> 
     <div class="field-wrap"> 
      <label>Zip code<span class="req">*</span></label> 
      <input type="text" name="zip_code" required autocomplete="off"/> 
     </div> 
     <div class="field-wrap"> 
      <label>Phone number<span class="req">*</span></label> 
      <input type="tel" name="phone_number" required autocomplete="off"/> 
     </div> 
     <div class="field-wrap"> 
      <label>Password<span class="req">*</span></label> 
      <input type="password" name="password" required autocomplete="off"/> 
     </div> 
     <div class="button-container"> 
      <button type="submit" class="button button-block"/>Sign Me Up!</button> 
     </div> 
     </form> 
     </div> 
    </div> 

そして、ここでのクライアント側のコードは、データベースへのユーザーの入力値を追加し、サーバー側のコードです。

passport.use("local-signup", new LocalStrategy({ 
    // Override username with email for authentication 
    usernameField: "email", 
    passwordField: "password", 
    passReqToCallback: true // Pass the entire request to the callback 
    }, 
    function(req, email, password, done) { 

    // Async task 
    // User.findOne wont run unless data arrives 
    process.nextTick(function() { 

     // Find user that matches the email provided on forms 
     // Checks for an already existing user that matches the credentials 
     User.findOne({ "local.email" : email }, function(err, user) { 
     // Return error if one exists 
     if(err) 
      return done(err); 

     // Checks for the existance of a user matching the email provided 
     if(user) { 
      return done(null, false, req.flash("signupMessage", "Email already used.")); 
     } else { 

      // If user with that email doesnt exists 
      // Generate a new user matching that email 
      var newUser  = new User(); 
      var firstname  = req.body.f_Name; 
      var lastname  = req.body.l_Name; 
      var address  = req.body.address; 
      var address2  = req.body.address_2; 
      var city   = req.body.city; 
      var zipcode  = req.body.zip_code; 
      var phonenumber = req.body.phone_number; 
      var passwordHash = newUser.generateHash(password); 
      // Adds new credentials 
      newUser.local.email  = firstname; 
      newUser.local.password  = passwordHash; 
      newUser.local.phone_number = phonenumber; 
      newUser.local.zip_code  = zipcode; 
      newUser.local.city   = city; 
      newUser.local.address_2 = address2; 
      newUser.local.address  = address; 
      newUser.local.l_Name  = lastname; 
      newUser.local.f_Name  = firstname; 

      // Save new credentials 
      newUser.save(function(err) { 
      if(err) 
       throw err; 
      return done(null, newUser); 
      }); 
     } 
     }); 
    }); 
    })); 

答えて

0

は、どのように私は、入力に注入されることから、悪質なコードを防ぐために、ユーザー入力を保護します、その後、nodejs上で実行されている私のバックエンドのthatsに保存されていますか?

回答:検証を使用しますが、より重要なことは、ユーザーの入力をエスケープすることです。


まず、検証を追加することができます。英数字(a〜Zおよび0〜9)のみを使用できます。しかし、ユーザーは自由にパスワードを選択できなければならないと思っています。つまり、どんな文字でも使えるはずです。 ;DROP TABLE USERSは私にとって素晴らしいパスワードのようです。

最後にSQLインジェクションが必要なので、ユーザー入力をデータベースクエリにパラメータとしてバインドするORMシステムを使用することをお勧めします。これは、すべてのクエリ、特にクエリがユーザー入力から構築されている場合に行う必要があります。

関連する問題