在哪里清理 PHP $_POST[] 输入?

2022-08-30 20:22:50

我正在使用codeigniter框架。

我应该在哪里清理PHP输入 - 控制器或模型?


答案 1

所有这些答案都与PHP方法有关,但与CodeIgniter无关。

开机自检数据

当您使用$this->input->post('item_name')时,CodeIgniter 会自动清理您的 POST 数据(如果您在配置中启用了global_xss.php)。如果您只想清洁特定物品,可以使用:

$this->input->post('item_name', TRUE);

无论哪种方式,您都可以免受XSS攻击和其他问题。

SQL 注入

如果您使用 ActiveRecord (insert()、update() 等)或使用 query() 绑定,则输入到数据库中的任何内容都将自动转义。

$this->db->query('INSERT INTO bla (?, ?)', array($foo, $bar));

这一切都逃脱了,所以不再纠结于什么去哪里。您可以只编写代码,并将安全到框架的手中。


答案 2

我曾经是尽可能集中卫生的朋友,但关于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'");

如果相同的数据随后用于mySQL查询,请在调用之前再次对其进行清理:

 $safe_category_name = mysql_real_escape_string ($unsafe_category_name);
 mysql_query("SELECT * FROM items WHERE category_name = '$safe_category_name'");

(这只是一个例子。如果从头开始一个项目,您将需要使用 PDO 和预准备语句,这样可以省去在此上下文中转义传入数据的麻烦。

如果相同的数据随后输出到网页中,则再次在呼叫前直接进行卫生操作:

$safe_category_name = htmlspecialchars($unsafe_category_name);
echo "<span>$safe_category_name</span>";

这种做法

  • 建立一个工作流,该工作流假定存在需要首先处理的不安全变量,从而产生更安全的编程样式 IMO。

  • 防止不必要的转换。

  • 帮助消除一键式方法使输入“安全”的错觉。没有。卫生条件100%取决于环境。


推荐