启用了不安全的HTTP方法
利用apache服务器的rewrite功能,对TRACE请求进行拦截。编辑httpd.conf文件增加下面内容:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
RewriteRule .* - [F]
更详细的解释如下:
LoadModule rewrite_module modules/mod_rewrite.so # 首先,激活rewrite模块
RewriteEngine On # 启用Rewrite引擎
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK) # 对Request中的Method字段进行匹配:^TRACE 即以TRACE字符串开头
RewriteRule .* - [F] # 定义规则:对于所有格式的来源请求,均返回[F]-Forbidden响应。
对于1.3.34以上和2.0.55以上版本的apache服务器,配置文件增加:TraceEnable off
或者用如下方法:
在项目或tomcat下的web.xml中,添加如下配置:
<!-- 关闭不安全的HTTP方法 -->
<security-constraint>
<web-resource-collection>
<web-resource-name>任意名称</web-resource-name>
<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>
<login-config>
<auth-method>BASIC</auth-method>
未授权访问(越权)
-
对当前登录用户进行权限验证。
-
使用session对用户的身份进行判断和控制。
session.setAttribute("username",username); if((String)session.getAttribute("username")!=admin){ (response.sendRedirect("XXX.jsp")}; 注意XXX.jsp为错误页面。
明文传输
- 使用正规的ca机构颁发的https证书
- 采用非对称加密方式(不可逆的加密方式)
- 建议按照网站的密级要求,需要对密码传输过程中进行加密得使用加密的方式传输,如使用HTTPS, 但加密的方式增加成本,或许会影响用户体验。如果不用 HTTPS,可以在网站前端用 Javascript 做密码加密,加密后再进行传输。
SQL注入
1、 通过参数化查询方式进行SQL注入攻击防护,参考代码:
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//为每一条数据添加一个参数
comm.CommandText = "select COUNT(*) from Users where Password = @Password and UserName = @UserName";
comm.Parameters.AddRange(
new SqlParameter[]{
new SqlParameter("@Password", SqlDbType.VarChar) { Value = password},
new SqlParameter("@UserName", SqlDbType.VarChar) { Value = userName},});
comm.ExecuteNonQuery();
}
//以“?”等位符进行参数化查询
PreparedStatement pstmt = con.prepareStatement("select * from table where name = ?");
pstmt.setString(1, para);
ResultSet rs = pstmt.executeQuery();
-
使用MyBatis技术,通过Mapper.xml文件定义SQL语句进行SQL注入攻击防护,参考代码:
<mapper namespace="TestUser"> //命名空间 <select id="getById" parameterType="java.lang.String" resultMap="TestFlowResult"> select <include refid="TestFlowColumns" /> <![CDATA[ from TEST_TABLE where INSPECT_ID = #{id} ]]> </select> </mapper> 注:在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。 -
使用特殊字符过滤程序防护SQL注入攻击,参考代码:
public static bool SqlCheck(string OldString) { bool Checkvalue = false; string NewString = OldString.ToLower(); string Replace = "'|and|exec|insert|select|delete|update|count|*|; |%|union|chr|mid|master|truncate|char|declare|asc|cast| set|fetch|varchar|sysobjects|drop|alert|script|<|>"; string[] arrReplace = Replace.Split('|'); for (int i = 0; i < arrReplace.Length; i++) { if (NewString.IndexOf(arrReplace[i].ToString()) >= 0) { bolvalue = true; break; } } return Checkvalue; } -
对数据库方面进行加固,来防止sql注入的产生:
1、不要以sysadmin的身份连接数据库。而是使用特定的数据库用户,只具有读取,写入和更新数据库中适当数据的适当特权。此帐户定期检查,确定它所具有的特权。 2、以安全的方式创建SQL。让数据库来完成创建SQL的工作,而不是在代码中完成。使用参数化SQL语句,同时也能提高查询的效率。 3、 保证数据库用户连接信息非明文保存。 -
对管理方面进行加固,来防止sql注入的产生:
1、加强编程人员良好的安全编码意识,系统地学习安全编码的知识,减少源代码泄露的风险。 2、建立起良好的代码审核、审查体系。由专人负责代码的审计,增加安全监督环节。
redis未授权访问
到redis安装目录下,配置redis.conf文件:
1、默认只对本地开放
bind 127.0.0.1
2、添加登陆密码
修改 redis.conf 文件,添加
requirepass mypasswd
3、在需要对外开放的时候修改默认端口(端口不重复就可以)
port 2344
4、以低权限运行 Redis 服务(重启redis才能生效)
为 Redis 服务创建单独的用户和家目录,并且配置禁止登陆
5、最后还可以配合iptables限制开放
MS08067安全实验室
Frieza
浙公网安备 33010602011771号