加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

PHP安全问题入门:10个常见安全问题+实例讲解

发布时间:2019-04-04 21:35:56 所属栏目:建站 来源:Charlie_Jade
导读:相对付其他几种说话来说, PHP 在 web 建站方面有更大的上风,纵然是新手,也能很轻易搭建一个网站出来。但这种上风也轻易带来一些负面影响,由于许多的 PHP 教程没有涉及到安详方面的常识。 此帖子分为几部门,每部门会涵盖差异的安详威胁和应对计策。但

正确的做法是武断不要信托用户的任何输入,并过滤掉输入中的全部非凡字符。这样就能没落绝大部门的 XSS 进攻:

  1. <?php  
  2. $searchQuery = htmlentities($searchQuery, ENT_QUOTES); 

可能你可以行使模板引擎 Twig ,一样平常的模板引擎城市默以为输出加上 htmlentities 防御。

假如你保持了用户的输入内容,在输出时也要出格留意,在以下的例子中,我们应承用户填写本身的博客链接:

  1. <body>  
  2.   <a href="<?php echo $homepageUrl; ?>">Visit Users homepage</a>  
  3. </body> 

以上代码也许第一眼看不出来有题目,可是假设用户填入以下内容:

  1. #" onclick="alert(1) 

会被渲染为:

  1. <body>  
  2.   <a href="#" onclick="alert(1)">Visit Users homepage</a>  
  3. </body> 

永久永久不要信托用户输入的数据,可能,永久都假设用户的内容是有进攻性的,立场规则了,然后警惕地处理赏罚好每一次的用户输入和输出。

另一个节制 XSS 进攻的要领是提供一个 CSP Meta 标签,可能标头信息,更多详情请见: https://www.html5rocks.com/en...

其它种 Cookie 时,假如无需 JS 读取的话,请必需配置为 "HTTP ONLY"。这个配置可以令 JavaScript 无法读取 PHP 端种的 Cookie。

3. XSRF/CSRF

CSRF 是跨站哀求伪造的缩写,它是进攻者通过一些技妙本领诱骗用户去会见曾经认证过的网站并运行一些操纵。

固然此处展示的例子是 GET 哀求,但只是相较于 POST 更轻易领略,并非防护本领,两者都不是私密的 Cookies 可能多步表单。

若是你有一个应承用户删除账户的页面,如下所示:

  1. <?php  
  2. //delete-account.php  
  3. $confirm = $_GET['confirm'];  
  4. if($confirm === 'yes') {  
  5.   //goodbye  

进攻者可以在他的站点上构建一个触发这个 URL 的表单(同样合用于 POST 的表单),可能将 URL 加载为图片勾引用户点击:

  1. <img src="https://example.com/delete-account.php?confirm=yes" /> 

用户一旦触发,就会执行删除账户的指令,眨眼你的账户就消散了。

防止这样的进攻比防止 XSS 与 SQL 注入更伟大一些。

最常用的防止要领是天生一个 CSRF 令牌加密安详字符串,一样平常称其为 Token,并将 Token 存储于 Cookie 可能 Session 中。

每次你在网页结构表单时,将 Token 令牌放在表单中的潜匿字段,表单哀求处事器往后会按照用户的 Cookie 可能 Session 里的 Token 令牌比对,校验乐成才给以通过。

因为进攻者无法知道 Token 令牌的内容(每个表单的 Token 令牌都是随机的),因此无法假充用户。

  1. <?php /* 你嵌入表单的页面 */ ?>  
  2. <form action="/delete-account.php" method="post">  
  3.   <input type="hidden" name="csrf" value="<?php echo $_SESSION['csrf']; ?>">  
  4.   <input type="hidden" name="confirm" value="yes" />  
  5.   <input type="submit" value="Delete my account" />  
  6. </form>  
  7. ##   
  8. <?php  
  9. //delete-account.php  
  10. $confirm = $_POST['confirm'];  
  11. $csrf = $_POST['csrf'];  
  12. $knownGoodToken = $_SESSION['csrf'];  
  13. if($csrf !== $knownGoodToken) {  
  14.   die('Invalid request');  
  15. }  
  16. if($confirm === 'yes') {  
  17.   //goodbye  

请留意,这是个很是简朴的示例,你可以插手更多的代码。假如你行使的是像 Symfony 这样的 PHP 框架,那么自带了 CSRF 令牌的成果。

你还可以查察关于 OWASP 更具体的题目和更多防止机制的文章: https://github.com/OWASP/CheatS....

4. LFI

LFI (当地文件包括) 是一个用户未履历证从磁盘读取文件的裂痕。

我常常碰着编程不类型的路由代码示例,它们不验证过滤用户的输入。我们用以下文件为例,将它要渲染的模板文件用 GET 哀求加载。

  1. <body>  
  2. <?php  
  3.   $page = $_GET['page'];  
  4.   if(!$page) {  
  5.     $page = 'main.php';  
  6.   }  
  7.   include($page);  
  8. ?>  
  9. </body> 

因为 Include 可以加载任何文件,不只仅是PHP,进攻者可以将体系上的任何文件作为包括方针转达。

  1. index.php?page=../../etc/passwd 

这将导致 /etc/passwd 文件被读取并展示在赏识器上。

要防止此类进攻,你必需细心思量应承用户输入的范例,并删除也许有害的字符,如输入字符中的“.” “/” “”。

假如你真的想行使像这样的路由体系(我不提议以任何方法),你可以自动附加 PHP 扩展,删除任何非 [a-zA-Z0-9-_] 的字符,并指定从专用的模板文件夹中加载,以免被包括任何非模板文件。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读