大家畅所欲言,当jFinal遇到XSS和SQL注入怎么处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大家畅所欲言,当jFinal遇到XSS和SQL注入怎么处理相关的知识,希望对你有一定的参考价值。

参考技术A 数据进入数据库之前对非法字符进行转义,在更新和显示的时候将非法字符还原
在显示的时候对非法字符进行转义
如果项目还处在起步阶段,建议使用第二种,直接使用jstl的<c:out>标签即可解决非法字符的问题。当然,对于javascript还需要自己处理一下,写一个方法,在解析从服务器端获取的数据时执行以下escapehtml()即可。

附:Javascript方法:

String.prototype.escapeHTML = function ()
return this.replace(/&/g, ‘&’).replace(/>/g, ‘>’).replace(/</g, ‘<’).replace(/”/g, ‘"’);


如果项目已经开发完成了,又不想大批量改动页面的话,可以采用第一种方法,此时需要借助Spring MVC的@InitBinder以及org.apache.commons.lang.PropertyEditorSupport、org.apache.commons.lang.StringEscapeUtils

public class StringEscapeEditor extends PropertyEditorSupport
private boolean escapeHTML;
private boolean escapeJavaScript;
private boolean escapeSQL;

public StringEscapeEditor() super();
public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript, boolean escapeSQL)
super();
this.escapeHTML = escapeHTML;
this.escapeJavaScript = escapeJavaScript;
this.escapeSQL = escapeSQL;


@Override
public void setAsText(String text)
if (text == null)
setValue(null);本回答被提问者和网友采纳
参考技术B 本来没错,可现在不这样认为,你爱的那个人也爱你才全对,你爱他,他不爱你没用

关于CI xss进攻和sql注入的防范问题

XSS过滤

输入类可以自动的对输入数据进行过滤,来阻止跨站脚本攻击。如果你希望在每次遇到 POST 或 COOKIE 数据时自动运行过滤,你可以在 application/config/config.php 配置文件中设置如下参数:

$config[‘global_xss_filtering‘] = TRUE;

或者自动设置get和post方法的第二个参数为true,则对输入的参数进行XSS过滤,注意只是XSS过滤,并不会对SQL注入进行有效的防范。

  $this->input->post("userName",TRUE);

 

防SQL注入

防SQL注入的原理主要是过滤判断条件(WHERE或LIKE)中字段的特殊字符(‘,\,%,_.....等),在特殊字段前加上转义字符等操作,使数据库能正常执行SQL,不会发生DatabaseError的问题

1、数字类型数组可以通过判断是否是数字和位数进行筛选,避免执行到数据库那里遇到问题

2、如果是纯字符串不需要特殊字符插库的话,可以判断如果有特殊字符的话就不继续执行,避免执行到数据库那里遇到问题

3、如果执行到数据库这里,需要对判断条件的字段进行过滤转义

 

这里说一下CI框架中转义的方式:

1、直接使用CI的AR(Active Record)的数据库CURD方式去处理

     (1)、插入:$this->db->insert("tableName",$insertArray);

     (2)、删除:$this->db->where("id",$id)->delete("tableName");

     (3)、更新:$this->db->where("id",$id)->update("tableName",$updateArray);

     (4)、查询:$this->db->where("id",$id)->select("id,name,age")->get("tableName");

     *这里有个细节需要get一下,where里面写sql自定义字符串时(下面的第4种方式),如where("id = ‘{$id}‘"),where这一块并不算是AR类的操作,换言之也就是不会自动进行过滤转义的

     *下面的4方式,自定义字符串方式虽然不是AR类写法,不支持自动过滤转义,但是可以支持where中写or的写法,相对灵活,如果遇到有or的情况,需要在那之前把判断的字段先转义

       过来,不管是用CI自己的方式(详见最下方的转义查询),还是自己封好的demo函数都可以

  1. 简单的 key/value 方式:

    $this->db->where(‘name‘, $name); // Produces: WHERE name = ‘Joe‘
    

    注意自动为你加上了等号。

    如果你多次调用该方法,那么多个 WHERE 条件将会使用 AND 连接起来:

    $this->db->where(‘name‘, $name);
    $this->db->where(‘title‘, $title);
    $this->db->where(‘status‘, $status);
    // WHERE name = ‘Joe‘ AND title = ‘boss‘ AND status = ‘active‘
    
  2. 自定义 key/value 方式:

    为了控制比较,你可以在第一个参数中包含一个比较运算符:

    $this->db->where(‘name !=‘, $name);
    $this->db->where(‘id <‘, $id); // Produces: WHERE name != ‘Joe‘ AND id < 45
    
  3. 关联数组方式:

    $array = array(‘name‘ => $name, ‘title‘ => $title, ‘status‘ => $status);
    $this->db->where($array);
    // Produces: WHERE name = ‘Joe‘ AND title = ‘boss‘ AND status = ‘active‘
    

    你也可以在这个方法里包含你自己的比较运算符:

    $array = array(‘name !=‘ => $name, ‘id <‘ => $id, ‘date >‘ => $date);
    $this->db->where($array);
    
  4. 自定义字符串:

    你可以完全手工编写 WHERE 子句:

    $where = "name=‘Joe‘ AND status=‘boss‘ OR status=‘active‘";
    $this->db->where($where);
    

 

转义查询

在提交数据到你的数据库之前,确保先对其进行转义是个非常不错的做法。 CodeIgniter 有三个方法来帮你做到这一点:

  1. $this->db->escape() 这个函数会检测数据类型,仅转义字符串类型的数据。 它会自动用单引号将你的数据括起来,你不用手动添加:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    
  2. $this->db->escape_str() 这个函数忽略数据类型,对传入的数据进行转义, 这个方法并不常用,一般情况都是使用上面的那个方法。方法的使用代码如下:

    $sql = "INSERT INTO table (title) VALUES(‘".$this->db->escape_str($title)."‘)";
    
  3. $this->db->escape_like_str() 这个函数用于处理 LIKE 语句中的字符串,

    这样,LIKE 通配符(‘%‘, ‘_‘)可以被正确的转义。

      $search = ‘20% raise‘;
      $sql = "SELECT id FROM table WHERE column LIKE ‘%" .
        $this->db->escape_like_str($search)."%‘ ESCAPE ‘!‘";

        *转义这里有一点需要get下,$this->db->escape()在使用这个函数之后,变量会自动在两侧加上单引号‘‘,同时也会在里面进行自动的过滤

        *比如会把abc变成‘abc‘ , 也会把a‘bc变成‘a\‘bc‘的,所以在写进where的sql自定义字符串中时,就不要再加单引号了,那样就会有两个单引号在变量外边(‘‘abc‘‘)

 

以上是关于大家畅所欲言,当jFinal遇到XSS和SQL注入怎么处理的主要内容,如果未能解决你的问题,请参考以下文章

XSS绕过WAF进行SQL注入

关于CI xss进攻和sql注入的防范问题

jfinal_sql注入问题解决

一文搞懂XSS攻击和SQL注入

一文搞懂XSS攻击和SQL注入

新型渗透手法:利用XSS绕过WAF进行SQL注入