Codeigniter - 消毒输入的最佳实践

时间:2013-02-07 17:59:45

标签: php codeigniter validation sanitize

我想知道使用Codeigniter清理用户输入的最佳做法是什么。

我知道CI提供了form_validation,例如set_rules。

'set_rules'=>'trim|xss_clean|alpha_numeric|htmlspecialchars'
  

“任何接受一个参数的本机PHP函数都可以用作   规则,如htmlspecialchars,trim,MD5等。“

我现在的问题是,

这足以保护我们免受xss,sql注入攻击等的影响吗?

我可以申请哪些其他规则?

就绩效而言,我们为所有投入应用所有这些规则是否代价高昂?

我理解MD5是一个哈希函数,但如果将MD5设置为规则的一部分会发生什么?

以上我也添加了javascript验证。我是否正确处理消毒输入和验证用户输入?请指教。

2 个答案:

答案 0 :(得分:14)

清理更多只是通过各种过滤器运行您的输入。

清理您的输入是关于不使用您不想要的用户数据污染您的应用程序。
但是,最重要的问题是,您不想要的是什么?

第一个例子

您已制作了一个页面,允许用户发送短信。您的预期输入将是电话号码和短信 查看手册中的Rule reference,我可能会遵循这些规则:

numeric|exact_length[8]

我希望这些规则确保输入为nummeric,输入与我所在地区的phonenumbers长度相匹配。由于我已经验证输入是nummeric,我可以假设XSS和SQL注入尝试失败(因为这些攻击包含非nummeric字符)。

对于短信字段,我会使用trim和required:trim|required,因为我不会发送空消息。

第二个例子

允许用户发表评论是允许用户向您的网站发送垃圾邮件或注入恶意代码的好方法。

基本上,你不是名字,电子邮件和评论。

需要输入所有内容。电子邮件需要验证。但是注释和名称需要对XSS和开销空间/换行进行一些清理。

我对sanitazion的验证看起来像这样:

$this->form_validation->set_rules('name', 'Name', 'required|trim|xss_clean');
$this->form_validation->set_rules('email', 'Email', 'required|trim|valid_email');
$this->form_validation->set_rules('comment', 'Comment', 'required|trim|xss_clean');

消毒你必须的东西 - 而不是你能做什么 - 并为你所需要的东西做好卫生处理 确保在将数据插入后端时使用Active Record/Query Builder正确转出输入,或者使用Query Bindings为您做同样的事情。

答案 1 :(得分:1)

如果您正在寻找私人功能,

function sanitizeString($value = ''){

    $value = trim($value);
    if (get_magic_quotes_gpc()) { $value = stripslashes($value); }

    $value = strtr($value,array_flip(get_html_translation_table(HTML_ENTITIES)));
    $value = strip_tags($value);
    $value = mysqli_real_escape_string(get_mysqli(), $value);
    $value = htmlspecialchars($value);

    return $value;
}

function get_mysqli() { 
    $db = (array)get_instance()->db;
    return mysqli_connect('localhost', $db['username'], $db['password'], $db['databse']);
} 

我正在使用它作为自定义函数来清理表单中传递的每个参数,对此我们可以添加更多自定义函数,我希望如此。 始终拥有自定义功能是一个优势 {@ 1}}或array_map也可用于进一步简化$ _GET,$ _POST等数组