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

Yas*_*sai 19 php codeigniter

我正在使用codeigniter框架.

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

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.

  • 防止不必要的转换.

  • 帮助消除一种单击方法使输入"安全"的错觉.没有.环境卫生取决于具体情况.

  • 更简单,如果它是vanilla PHP中的ID,您可以使用$ id =(int)$ _POST ['id']来确保安全. (2认同)

小智 8

消毒取决于数据的消毒程度.

通常有两种类型的消毒:

  • 数据库输入
  • 前端输出

在第一种情况下,它是为了防止SQL注入攻击,第二种是防止跨站点脚本攻击.

因此,要回答您的问题(关于上述攻击媒介),您的清理应该是存在漏洞的地方,更具体地说:

  • 在哪里编写带有变量的SQL查询(模型)
  • 你在哪里写任何输出(通常是HTML)(视图)

我希望这有帮助.


Que*_*tin 7

控制器应该很薄.

应该在模型中清理PHP输入,以便与模型保存的位置有关.即防止模型中的SQL注入.

它应该在视图中进行消毒,以便与最终输出有关.即在视图中阻止XSS.

基本上,所有敏感应该及时进行,以防止不良数据造成任何伤害.

  • 你能说出控制器应该薄的原因吗?我并不是说这是错的或类似的东西,我只是好奇. (2认同)
  • @rogeriopvl,我会说因为松耦合的概念.您希望控制器仅根据其目的做出决策,而不是基于数据通过控制器后将要发生的事情的假设. (2认同)