Codeigniter - 最佳实践:如何对输入进行清洁处理

7

我希望了解使用Codeigniter进行用户输入的最佳实践。

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

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

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

我的问题是,

这样足以保护我们免受 XSS、SQL 注入攻击等吗?

我还能应用哪些其他规则?

在性能方面,将所有输入都应用这些规则会很昂贵吗?

我知道 MD5 是一种哈希函数,但如果将其设置为规则的一部分会发生什么?

另外,我也添加了 JavaScript 验证。请问我的输入过滤和用户输入验证方法是否正确?


1
任何接受一个参数的本地PHP函数都可以用作规则,例如htmlspecialchars、trim、MD5等。这让我想知道它们怎么称呼它。 - PeeHaa
2个回答

15

清洗输入不仅仅是通过各种过滤器来处理输入。

清洗输入是关于不让用户输入污染你的应用程序。
然而,重要问题是,你不想要什么?

第一个例子

你创建了一个页面,允许用户发送文本消息。 你期望的输入是电话号码和短信。
查看手册中的规则参考,我可能会选择以下规则:

numeric|exact_length[8]

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

对于文本消息字段,我会使用trim和required:trim|required因为我不希望发送空消息。

第二个例子

允许用户评论是一种允许用户在您的网站上发垃圾邮件或注入恶意代码的好方法。

基本上,你需要一个名字、一个电子邮件和评论。

所有的输入都需要必填。电子邮件需要进行验证。但是评论和姓名需要清理XSS和额外的空格/换行符。

我的验证和净化如下所示:

$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,该工具会为您完成相同的操作。


感谢您抽出时间回复我。它确实帮助了我更好地理解。 - vincent

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

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

数据库应该是database。 - Goose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接