我正在创建一个应用程序,用户可以在其中创建“帖子”和“评论”。一旦提交了这些帖子和评论,它们就会被ajax发送到php页面并插入到数据库中。然后从数据库中检索它们并立即插入到页面中而无需批准。 我希望有一个严格的正则表达式,以便不能提交有害文本,但也允许一些unicode字符,如重音元音。所以我的javascript正则表达式如下:
postRegex = /^([A-Za-z0-9\u00C0-\u017F \/.,-_$!\'&*()="?#+%:;\[\]\r\r\n]{1,1000})$/;
我的理论是如果我不允许括号如< >那么这可以阻止插入脚本标签。但是,当我尝试提交iframe嵌入代码等文本时,令我惊讶的是,表单已提交。
<iframe width="100%" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/217462626&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true"></iframe>
根据我对这个正则表达式的理解,我认为它不会让&lt;&gt;括号提交。
我的正则表达式似乎确实有效,因为它不提交表格时的字符为|在文本中。我的正则表达式中有错误吗?
如果有更好的方法可以阻止插入恶意内容,也可以给我建议。
在服务器端,我也在清理内容(在插入数据库之前),如下面的submit_post.php所示。
HTML表单:
<form id="post_form" name="post_form" method="post" action="">
<label for="post_text"></label>
<textarea id="post_text" name="post_text" maxlength="1000" placeholder="Write your post here..." rows="2" data-role="none" required></textarea>
</form>
Javascript和JQuery:
$("#post_form").on('submit', function(e){
//this will execute when a post is submitted.
e.preventDefault();
var text_of_post = $('#post_text').val();
var postIsValid = validateInput(text_of_post, postRegex);
if(!postIsValid){
console.log('not valid');
//content of form is not valid
}else{
//content of form is valid
$.ajax({
//do an ajax request passing along the user json web token for validation on server side and also the text that was submitted.
url: app_root_url + 'submit_post.php',
data: {'usertoken': token, 'text_of_post' : text_of_post},
type: "POST",
success: function(data){
var result = JSON.parse(data);
}
});
}
});
function validateInput(inputValue, regularExpression){
var inputIsValid = regularExpression.test(inputValue);
return inputIsValid;
}
PHP: submit_post.php
$postText = filter_var($_POST['text_of_post'], FILTER_SANITIZE_STRING);