私のサインアップフォームのスニペットは、私がサービスにサインアップするときにユーザー情報を保存するために使いたいものです。ログイン時にファーストネームを表示したいので、ウェブブラウザで悪質なコードが実行される可能性があります。問題は、悪意のあるコードが入力に注入されるのを防ぐためにユーザー入力を保護する方法と、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);
});
}
});
});
}));