Phi*_*eon 22
所有这些答案都与PHP方法有关,但与CodeIgniter无关.
发布数据
如果在config.php中启用了global_xss,则在使用$ this-> input-> post('item_name')时,CodeIgniter会自动清除POST数据.如果您只希望清洁特定物品,可以使用:
$this->input->post('item_name', TRUE);
Run Code Online (Sandbox Code Playgroud)
无论哪种方式,您都可以免受XSS攻击和其他问题的影响.
SQL注入
如果使用ActiveRecord(insert(),update()等)或使用query()绑定,则会自动转义输入数据库的任何内容.
$this->db->query('INSERT INTO bla (?, ?)', array($foo, $bar));
Run Code Online (Sandbox Code Playgroud)
这一切都是逃脱的,所以不再对于那里的事情感到不满.您可以编写代码并将安全保留在框架中.
Pek*_*ica 19
我曾经是尽可能集中环境卫生的朋友,但对SO的广泛讨论(例如这里)改变了我的想法.绝对值得一读.
我向你提交以下做法:
在中央验证例程中,不进行卫生,或仅进行"粗略"检查(例如,对于数据类型)和大小("$ _POST ["category_name"]不应大于200字节.")
将传入变量标记为不安全(例如$unsafe_id = $_POST["category_name"];
).将它们存储在您可用的任何控制器/类/构造中.
清理使用它的数据.exec
例如,如果在呼叫中使用传入数据,请直接在呼叫前进行必要的卫生:
$safe_category_name = escapeshellargs($unsafe_category_name);
exec("external_binary -category_name '$safe_category_name'");
Run Code Online (Sandbox Code Playgroud)
如果在mySQL查询中使用相同的数据,则再次在调用前清理它:
$safe_category_name = mysql_real_escape_string ($unsafe_category_name);
mysql_query("SELECT * FROM items WHERE category_name = '$safe_category_name'");
Run Code Online (Sandbox Code Playgroud)
(这只是一个例子.如果从头开始一个项目,你将需要使用PDO和预处理语句,这消除了在此上下文中转义传入数据的麻烦.)
如果然后在网页中输出相同的数据,则再次直接在呼叫前进行卫生:
$safe_category_name = htmlspecialchars($unsafe_category_name);
echo "<span>$safe_category_name</span>";
Run Code Online (Sandbox Code Playgroud)
这种做法
建立一个工作流程,假设存在需要首先处理的不安全变量,这将导致更安全的编程风格IMO.
防止不必要的转换.
帮助消除一种单击方法使输入"安全"的错觉.没有.环境卫生取决于具体情况.
控制器应该很薄.
应该在模型中清理PHP输入,以便与模型保存的位置有关.即防止模型中的SQL注入.
它应该在视图中进行消毒,以便与最终输出有关.即在视图中阻止XSS.
基本上,所有敏感应该及时进行,以防止不良数据造成任何伤害.