网站安全 与 常见的 web 攻击

网站安全 与 常见的 web 攻击


1 sql 注入(常用的攻击性)(django的orm是做过sql防护处理的)


危害:

    非法读取,篡改,删除数据库中的数据
    盗取用户的各类敏感信息。获取利益
    通过修改数据库来修改网页的内容
    注入木马等

原理 :在输入中 加入 一定成立的sql 语句

            def post(self,request):
                user_name = request.POST.get('username', '')  # 输入 ' OR 1=1 #ahdsahdsadsasad(#表示注释)
                user_pwd = request.POST.get('password', '')
                import pymysql
                conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='',db='mxonline',charset='utf8')
                cursor = conn.cursor()
                sql_select = "SELECT * FROM users_userprofile WHERE email ='{0}' and password = '{1}'".format(user_name,user_pwd)
                result = cursor.execute(sql_select)
                for row in cursor.fetchall():
                    if row:
                        return HttpResponse('登陆成功!')

解决方法:

    合法输入 ,不能输入单引号 ' # ;
    正则匹配
    django 的 orm
    excute执行SQL语句的时候,必须使用参数化的方式,否则必然产生SQL注入漏洞。
        cursor.execute("SELECT * FROM users_userprofile WHERE email =%s and username = %s",(user_name,user_pwd))


2 xss 攻击 xss跨站脚本攻击 cross site script


危害:

    盗取账号,网银,商业价值的资料
    非法转账
    控制受害者 向其他网站发起攻击

原理:

    受害者 -->> 服务器 url 请求信息

    服务器 没有对请求信息做验证

        http:// www.bank.com/product/list?name=‘alex’</script>  ===>>  正常情况 会回显 name的内容给浏览器

        http:// www.bank.com/product/list?name=<script>x=document.cookie;alert(x)</script> ===>> 漏洞, 返回 script脚本,给浏览器

        可能 把 cookie泄露

xss 完整流程:

    用户 --- 服务器有 xss 漏洞

    黑客 向客户发送 伪装的请求连接(可能包括获取用户sesson cookie到黑客 服务器上的 js代码 )

    用户点击 伪装请求

    服务器没有判断(存在漏洞) --执行脚本后 把数据 传给 黑客

    黑客 通过session伪装用户 获取用户所有信息

xss 攻击 防护:

    首先  对代码中 用户输入的 特殊符号做 过滤
        '<' '>' ';' ''

    尽量避免 暴露 用户隐私在 cookie中
    通过cookie 和 ip绑定,来降低 cookie泄露的危害

    尽量 使用 post的表单提交


3 csrf 攻击 跨站请求伪造 cross site request forgery

危害:

    以用户名义发送邮件
    盗取用户的账号
    购买商品
    虚拟货币转账

原理:

基本都是post 请求 会存在 账号密码提交时候的隐患

   ! 用户访问 安全的服务器 A 货币相关
    (返回 session ID)
    每次请求都会带有session

   !! 用户没有登出 A的情况下 访问 不安全的 B 服务器  --- cookie没有失效

   !!! B返回 内容 包括 一个危险的  (伪装成图片或者其他)要求 用户访问A的 转账url


<img src=http://www.mybank.com/Transfer/toBankID=11&money=10000>

csrf 攻击防护 增加 csrf 验证 保证每次的post提交都有服务端生成的 csrf

    { % csrftoken % } <br>

4 点击劫持(ClickJacking

视觉上的欺骗手段,诱使用户与页面进行交互,实施的攻击成本更高
   
      1  攻击者使用一个透明的iframe,覆盖在一个网页上,然后诱使用户在该页面上进行操作,此时用户将在不知情的情况下点击透明的iframe页面  
      2  攻击者使用一张图片覆盖在网页,遮挡网页原有位置的含义

解决方法:

现代浏览器采用X-Frame-Options HTTP标头,该标头指示是否允许在框架或iframe中加载资源

Internet Explorer 8+
Edge
Firefox 3.6.9+
Opera 10.5+
Safari 4+
Chrome 4.1+

如果响应中包含带有SAMEORIGIN值的标头,则浏览器将仅在请求源自同一站点的情况下才将资源加载到框架中。

如果标头设置为DENY,则无论哪个站点发出请求,浏览器都将阻止资源加载到框架中

    DENY:浏览器会拒绝当前页面加载任何frame页面;
    
    SAMEORIGIN:frame页面的地址只能为同源域名下的页面;
    
    ALLOW-FROM origin:允许frame加载的页面地址;

Apache配置:

Header always append X-Frame-Options SAMEORIGIN

nginx配置:

add_header X-Frame-Options SAMEORIGIN;

Django框架设置:

1 中间件设置全部响应
MIDDLEWARE = [
    ...
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ...
]

X_FRAME_OPTIONS = 'DENY' # SAMEORIGIN

# Django3.0+ -> DENY
2 装饰器, 单独试图
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_deny
from django.views.decorators.clickjacking import xframe_options_sameorigin
from django.views.decorators.clickjacking import xframe_options_exempt

@xframe_options_deny
def view_one(request):
    return HttpResponse("I won't display in any frame!")

@xframe_options_sameorigin
def view_two(request):
    return HttpResponse("Display in a frame if it's from the same origin as me.")

@xframe_options_exempt
def ok_to_load_in_a_frame(request):
    return HttpResponse("This page is safe to load in a frame on any site.")

Django-clickjacking

5 http的安全隐患

HTTP本身不具备加密的功能,无法做到对通信整体进行加密

通信使用明文,内容可能会被窃听;

不验证通信方的身份,因此有可能遭遇伪装;

无法证明报文的完整性,有可能已遭篡改;

SSL提供认证和加密处理及摘要功能;

6 不安全的登录站点 Insecure Logon Site

标准用户登录页面位于默认位置,并且可以通过未加密的HTTP访问

最佳做法

    为这些页面提供鲜为人知的URL 
    
    以防止机器找到它们
    
    使用HTTPS保护这些页面。

7 未启用HSTS HSTS Not Enabled

Web服务器尚未配置HSTS(HTTPS严格传输安全性) 通过开启HSTS(HTTP Strict Transport Security)功能, 可以强制客户端(例如:浏览器)使用HTTPS与服务器创建连接,降低第一次访问请求被拦截的风险

Buy me a 肥仔水!