我的 Codeigniter 使用 ajax 自动完成
Posted
技术标签:
【中文标题】我的 Codeigniter 使用 ajax 自动完成【英文标题】:My Codeigniter autocomplete with ajax 【发布时间】:2011-10-11 06:24:22 【问题描述】:我正在向我的网站添加私人消息。在我的表单的收件人文本字段中,我想在有人开始输入时建议有效的用户名。在阅读了教程并研究了一些脚本之后,我编写了以下代码,用于从名为 users 的数据库表中建议用户名。它有效,但我不确定它的正确性和安全性。
Jquery(使用 Jquery UI 自动完成插件):
$(function()
$( "#username" ).autocomplete( //the recipient text field with id #username
source: function( request, response )
$.ajax(
url: "http://localhost/mysite/index.php/my_controller/search_username",
dataType: "json",
data: request,
success: function(data)
if(data.response == 'true')
response(data.message);
);
,
minLength: 1,
select: function( event, ui )
//Do something extra on select... Perhaps add user id to hidden input
,
);
);
控制器(为简单起见,虽然我打算使用模型,但我没有使用)
function search_username()
$username = trim($this->input->get('term')); //get term parameter sent via text field. Not sure how secure get() is
$this->db->select('id, username');
$this->db->from('users');
$this->db->like('username', $username);
$this->db->limit('5');
$query = $this->db->get();
if ($query->num_rows() > 0)
$data['response'] = 'true'; //If username exists set true
$data['message'] = array();
foreach ($query->result() as $row)
$data['message'][] = array(
'label' => $row->username,
'value' => $row->username,
'user_id' => $row->id
);
else
$data['response'] = 'false'; //Set false if user not valid
echo json_encode($data);
【问题讨论】:
【参考方案1】:我建议进行一项修改...
我将通过将第二个参数 TRUE
传递给 get()
来启用 XSS 保护
$username = trim($this->input->get('term', TRUE));
【讨论】:
【参考方案2】:如果您希望该函数仅适用于 ajax 调用,您还可以添加更多异常:
if($this->input->is_ajax_request())
//... process the input
else
show_404();
【讨论】:
谢谢!我一定会补充的。【参考方案3】:Codeigniter 活动记录数据库应该使您的代码清除任何 SQL 注入。如果您不发布任何内容,则无需担心 XSS。
使用它,某人可以获得所有可能的用户名列表.. 但除此之外,我会说它是“安全的”(它看起来与我在我的网站上使用的非常相似 =p)
编辑:
如果您不发布任何内容,则无需担心 XSS。
我应该澄清一下,如果您要发布任何内容(显示用户输入的任何内容),那么您应该进行 XSS 过滤(johndavidjohn 在我下面的回答解释了 [只需将 TRUE 作为第二个参数传递])..我不太明白你在解释什么是“术语”时的意思......如果你所做的只是搜索,那么你不需要 XSS 过滤器,但如果用户可以发送/编写消息(生成您的网站存储的内容 [待显示]),那么您应该在 iput 上过滤 XSS。
【讨论】:
谢谢,我确实添加了limit('5')
,所以有人无法检索整个数据库表。
哦,是的,它肯定会设置一个很大的障碍,但有人可以尝试不同的字母组合和脚本......我只是说你让整个用户群保持开放......可能是您想要的!但是如果您只想要“朋友”或能够自动完成的东西,那么您应该更改代码..
是的,用户也通过邮件发送消息,但我单独处理。也许最好的办法是检查用户在提交时是否有效(没有 ajax)而不是建议。以上是关于我的 Codeigniter 使用 ajax 自动完成的主要内容,如果未能解决你的问题,请参考以下文章
在 Codeigniter 中无需终端(无 AJAX)的页面加载时自动运行 PHP 服务器
CodeIgniter、Ajax... 如何使用 insert_id()
Codeigniter- Ajax Codeigniter Ajax - 通过ajax返回不止一行
使用 codeigniter 和 jquery 进行 AJAX 分页