美文网首页
web网站的安全问题

web网站的安全问题

作者: 田文健 | 来源:发表于2018-11-20 10:24 被阅读0次

1.不安全的http请求
http请求除了常见的get post之外、还有put、delete、options、Head、trace等请求方法,这些请求方法是不安全的,所以需要禁用。Tomcat的禁用方式是在web.xml中加入:

<!--禁用不安全的http method-->
    <security-constraint>
        <web-resource-collection>
            <url-pattern>/*</url-pattern>
            <http-method>PUT</http-method>
            <http-method>DELETE</http-method>
            <http-method>HEAD</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
        </web-resource-collection>
        <auth-constraint>
        </auth-constraint>
    </security-constraint>

2.xss注入
xss注入是当渲染在HTML中的内容含有类似<script>alert(3)</script>这样的js脚本时,脚本可能在浏览器中被执行。如果这些脚本是其他用户(比如在一个论坛中)添加的,那么可能执行操作。解决方法是在后台数据返回给前端时过滤掉这些脚本。如果是json,那么可以添加一个messageConverter,在Spring MVC的配置中加入

<!-- 这里配置spring的注解,使得@Controller @RequestMapping等注解可以被识别 -->
    <bean
            class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <bean
                        class="com.zjepe.appdev.planprophase.utils.xss.XSSMappingJackson2HttpMessageConverter"/>
            </list>
        </property>
    </bean>

关于XSSMappingJackson2HttpMessageConverter的实现:

package com.zjepe.appdev.planprophase.utils.xss;

import java.io.IOException;
import java.lang.reflect.Type;

import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import com.fasterxml.jackson.databind.JavaType;

public class XSSMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {

    @Override
    public Object read(Type type, Class<?> contextClass,
            HttpInputMessage inputMessage) throws IOException,
            HttpMessageNotReadableException {
        JavaType javaType = getJavaType(type, contextClass);
        Object obj = readJavaType(javaType, inputMessage);
        String json = super.getObjectMapper().writeValueAsString(obj);
        String result = cleanXSS(json.toString());
        Object resultObj = super.getObjectMapper().readValue(result, javaType);
        return resultObj;
    }

    // 这个就是父类的readJavaType方法,由于父类该方法是private的,所以我们copy一个用
    private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) {
        try {
            return super.getObjectMapper().readValue(inputMessage.getBody(),
                    javaType);
        } catch (IOException ex) {
            throw new HttpMessageNotReadableException("Could not read JSON: "
                    + ex.getMessage(), ex);
        }
    }


    // 重写writeInternal方法,在返回内容前首先进行加密
    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        // 使用Jackson的ObjectMapper将Java对象转换成Json String
        String json = super.getObjectMapper().writeValueAsString(object);
        String result = cleanXSS(json.toString());
        // 输出
        
        outputMessage.getBody().write(result.getBytes("utf-8"));
    }

    private String cleanXSS(String value) {
        String res  = Jsoup.clean(value.toString(), Whitelist.relaxed());
        return res;
    }
}

3.sql注入
sql注入是用户在表单中输入了包含SQL的内容,可能会在数据库中执行的问题。数据库支持参数化查询即可避免这个问题,一般的ORM框架都会使用参数化查询。如果使用字符串拼接SQL,那么需要对参数进行检查。

4.csrf跨站请求
出现这个问题的原因是浏览器不限制其他站点的表单跨域请求,而且这个请求会携带cookie。即使操作改为post也不能解决这个问题。有两种方式解决这个问题:一种是校验请求的referer,如果不是自己站点的则拒绝(需要排除一些例外,比如首页)。第二种是不用浏览器自动的cookie作为用户令牌(或者增加双重令牌),即在操作请求时手动设置令牌。

相关文章

网友评论

      本文标题:web网站的安全问题

      本文链接:https://www.haomeiwen.com/subject/tsktqqtx.html