我需要转义通过AJAX输出的文本。如果我向数据库提交脚本,如<script>alert('hello world');</script>
,则会在页面上执行弹出窗口。
这是我的函数,它设置数据,然后获取要通过AJAX发送的数据。
function add_order() {
if($_SERVER['REQUEST_METHOD'] == "POST") {
$add_order = $this->order_model->set_order($_POST['text']);
if($add_order==false){
echo "fail";
return false;
}
$order_data = $this->order_model->get_order_by_id($add_order);
echo json_encode($order_data);
return true;
}
}
Jquery代码:
$('#create_order').submit(function(){
$.post('/order/add_order/', $('#create_order').serialize(), function(data){
var obj = $.parseJSON(data);
var obj_item = obj[0];
$('tr.'+obj_item.id).append("<td>" + obj_item.text + "</td>");
msg('success', 'Part #'+obj_item.number+' has been successfully created');
});
}
return false;
});
如何阻止obj_item.text执行脚本?
您需要构建DOM元素并设置文本,而不是构建HTML:
$("<td />", { text: obj_item.text }).appendTo('tr.tr.' + obj_item.id);
如果提交的数据只能包含纯文本,请确保使用.text()
将其重新插入DOM-使用.text
将防止任何嵌入的标记被呈现为HTML或由浏览器以其他方式处理。
您还应该在存储数据之前验证服务器上的数据,并在将数据发布到服务器之前执行客户端验证以获得额外的措施。IMHO,拒绝坏数据比简单地逃离它要好。