Codeigniter - 清理输入的最佳实践

Posted

技术标签:

【中文标题】Codeigniter - 清理输入的最佳实践【英文标题】:Codeigniter - best practice to sanitize input 【发布时间】:2013-01-23 08:20:49 【问题描述】:

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

我了解 CI 提供 form_validation,例如 set_rules。

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

"任何接受一个参数的原生 php 函数都可以用作 规则,如 htmlspecialchars、trim、MD5 等。”

我现在的问题是,

这足以保护我们免受 xss、sql 注入攻击等攻击吗?

还有哪些我可以应用的规则?

就性能而言,对所有输入应用所有这些规则对我们来说成本高吗?

我知道 MD5 是一个哈希函数,但是如果您将 MD5 设置为规则的一部分会怎样?

在上面,我还添加了 javascript 验证。我在清理输入和验证用户输入方面是否走在正确的轨道上?请指教。

【问题讨论】:

"任何接受一个参数的原生PHP函数都可以作为规则使用,如htmlspecialchars、trim、MD5等。"这让我想知道他们怎么称呼它 【参考方案1】:

清理不仅仅是通过各种过滤器运行您的输入。

清理您的输入是为了不让您不想要的用户数据污染您的应用程序。不过,最大的问题是,您不想要什么?

第一个例子

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

numeric|exact_length[8]

这些规则,因为我想确保输入是数字,并且输入与我所在地区的电话号码长度相匹配。由于我已经验证输入是数字,我可以假设 XSS 和 SQL 注入尝试应该失败(因为这些攻击包含非数字字符)。

对于文本消息字段,我会使用 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,这对您也是如此。

【讨论】:

感谢您抽出宝贵时间回复我。它确实帮助我更好地理解。【参考方案2】:

如果您正在寻找一个私有函数,

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']);
 

我将其用作自定义函数来清理表单中传递的每个参数,除此之外我们还可以添加更多自定义函数,我希望。 始终拥有自定义功能是一个优势 array_maparray_walk 也可用于进一步简化 $_GET、$_POST 等数组

【讨论】:

数据库应该是数据库

以上是关于Codeigniter - 清理输入的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter 资产文件夹最佳实践

将特定页面限制为仅在 Codeigniter 中登录用户的最佳实践是啥?

CodeIgniter 中处理数据库错误的最佳实践

使用 codeigniter 实现动态菜单/页眉/页脚的最佳方法

Artifactory清理未使用的二进制品的最佳实践

Artifactory清理未使用的二进制品的最佳实践