您好,欢迎访问一九零五行业门户网

最佳实践系列(三)-- PHP 安全三板斧:过滤、验证和转义之过滤篇_html/css_WEB-ITnose

我们在开发应用时,一般有个约定:不要信任任何来自不受自己控制的数据源中的数据。例如以下这些外部源:
$_get $_post $_request $_cookie $argv php://stdin php://input file_get_contents() 远程数据库 远程api 来自客户端的数据 所有这些外部源都可能是攻击媒介,可能会(有意或无意)把恶意数据注入php脚本。编写接收用户输入然后渲染输出的php脚本很容易,可是要安全实现的话,需要下一番功夫。我这里以陈咬金的三板斧为引子,给大家介绍三招:过滤输入、验证数据,以及转义输出。
1、过滤输入 过滤输入是指转义或删除不安全的字符。在数据到达应用的存储层之前,一定要过滤输入数据,这是第一道防线。假如网站的评论框接受html,用户可以随意在评论中加入恶意的
这篇文章很有用!

如果不过滤这个评论,恶意代码会存入数据库,然后在网页中渲染,当用户访问这个页面时,会重定向到可能不安全的钓鱼网站(这种攻击有一个更专业的称呼:xss攻击)。这个简单示例很好的说明了为什么我们要过滤不受自己控制的输入数据。通常我们要过滤的输入数据包括html、sql查询以及用户资料等。
html
我们可以使用php提供的 htmlentities函数过滤html,该函数会将所有html标签字符(&、等)转化为对应的html实体,以便在应用存储层取出后安全渲染。但是有时候我们是允许用户输入某些html元素的,尤其是输入富文本的时候,不如图片、链接这些,但是 htmlentities不能验证html,检测不出输入字符串的字符集,故而无法实现这样的功能。
update(['password'=>bcrypt($password)]);
由于模型类底层调用的是是查询构建器的方法,所以最终会调用builder( illuminate\database\query\builder)的 update方法:
public function update(array $values){ $bindings = array_values(array_merge($values, $this->getbindings())); $sql = $this->grammar->compileupdate($this, $values); return $this->connection->update($sql, $this->cleanbindings($bindings));}
这段代码传入参数是要更新的值,然后通过 $bindings获得绑定关系,这里我们我们获取到的应该是包含 password和 updated_at(默认更新时间戳)的数组,然后再通过grammar( illuminate\database\query\grammars\grammar)类的 compileupdate方法生成预处理sql语句,这里对应的sql语句是:
update `users` set `password` = ?, `updated_at` = ? where `id` = ?
然后最终将预处理sql语句和对应绑定关系传递给数据库去执行。关于sql注入我们还会在后续数据库部分继续讨论。
其它类似信息

推荐信息