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

浅谈PHP安全规范

发布时间:2018-10-15 10:42:58 所属栏目:评论 来源:littlepotato
导读:【新品产上线啦】51CTO播客,随时随地,碎片化学习 一、前言 php因天生支持web应用的开发,以其简单易学,开发效率高而备受喜爱。使其占据了大片的市

Low level

  1. <?php  
  2.  
  3. // Is there any input?  
  4. if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {  
  5.     // Feedback for end user  
  6.     echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';  
  7. }  
  8.  
  9. ?>  

Medium level

  1. <?php  
  2.  
  3. // Is there any input?  
  4. if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {  
  5.     // Get input  
  6.     $name = str_replace( '<script>', '', $_GET[ 'name' ] );  
  7.  
  8.     // Feedback for end user  
  9.     echo "<pre>Hello ${name}</pre>";  
  10. }  
  11.  
  12. ?>  

High level

  1. <?php  
  2.  
  3. // Is there any input?  
  4. if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {  
  5.     // Get input  
  6.     $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); 
  7.  
  8.     // Feedback for end user  
  9.     echo "<pre>Hello ${name}</pre>";  
  10. }  
  11.  
  12. ?>  

Impossible level

  1. <?php  
  2.  
  3. // Is there any input?  
  4. if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {  
  5.     // Check Anti-CSRF token  
  6.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  
  7.  
  8.     // Get input  
  9.     $name = htmlspecialchars( $_GET[ 'name' ] );  
  10.  
  11.     // Feedback for end user  
  12.     echo "<pre>Hello ${name}</pre>";  
  13. }  
  14.  
  15. // Generate Anti-CSRF token  
  16. generateSessionToken();  
  17.  
  18. ?> 

通过以上的代码范例可以看到,在medium和high的防御措施上,仍旧是黑名单式的过滤,而且思考的很狭隘,只是过滤了<script>标签,medium中直接硬编码的黑名单最不可取,别说换标签,直接大小写绕过;在High级别里面,通过正则,避免了<script>标签使用的可能,但是能够触发js的标签远不止这一个,随便一个<img src=1 onerror=[xss]>如都是可以绕过的。可以想到基于黑名单的策略是很容易疏漏的,不可取。在impossible中,直接对输入进行htnlspecilchars()编码转换,杜绝了xss。

(2) 存储型

注意下面的代码只是偏向于服务器对用户的输入不经过验证处理就直接入库,导致下次取出展现到前端的时候出现xss。代码没有包含从数据库取出的操作部分。因为只要从用户获取到数据后进行了严格的验证处理,就可以避免存储型xss,所以最终原因不是从数据库取出部分,所以DVWA省略掉了。出于篇幅原因,在DVWA的存储型的漏洞复现中的缺陷细节和反射型类似,都是标签,正则过滤不全。就不再赘述,现把impossible代码规范列出:

  1. <?php  
  2.  
  3. if( isset( $_POST[ 'btnSign' ] ) ) {  
  4.     // Check Anti-CSRF token  
  5.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );  
  6.  
  7.     // Get input  
  8.     $message = trim( $_POST[ 'mtxMessage' ] );  
  9.     $name    = trim( $_POST[ 'txtName' ] );  
  10.  
  11.     // Sanitize message input  
  12.     $message = stripslashes( $message );  
  13.     $message = mysql_real_escape_string( $message );  
  14.     $message = htmlspecialchars( $message );  
  15.  
  16.     // Sanitize name input  
  17.     $name = stripslashes( $name );  
  18.     $name = mysql_real_escape_string( $name );  
  19.     $name = htmlspecialchars( $name );  
  20.  
  21.     // Update database  
  22.     $data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );  
  23.     $data->bindParam( ':message', $message, PDO::PARAM_STR );  
  24.     $data->bindParam( ':name', $name, PDO::PARAM_STR );  
  25.     $data->execute();  
  26. }  
  27.  
  28. // Generate Anti-CSRF token  
  29. generateSessionToken();  
  30.  
  31. ?> 

(编辑:威海站长网)

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

热点阅读