6

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

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

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

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

我现在的问题是,

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

我还可以应用哪些其他规则?

就性能而言,我们对所有输入应用所有这些规则是否成本高昂?

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

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

4

2 回答 2

14

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

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

第一个例子

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

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正确转义您的输入时,或者您正在使用对您执行相同操作的查询绑定。

于 2013-02-07T19:34:00.223 回答
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_map,或者array_walk也可以用于进一步简化它,用于 $_GET、$_POST 等数组

于 2015-06-25T13:42:44.273 回答