XSS攻撃:----->ウェブ注入
定義:
XSS XSS(クロスサイトスクリプト、XSSと呼ばれる)時間のほとんどは、いわゆる、ドメイン間での攻撃をスクリプトされているので、「HTMLインジェクション」の一種である「クロスドメインスクリプティング。」
私たちはしばしば聞くそして最後に「注入」は、そのようなSQLインジェクションとして、(インジェクション)「注入された」とは何ですか?注入は、自然の中でのプログラム実行文への入力データにあります。SQLインジェクションはXSSも真であり、そうであるが、XSSは、通常、スクリプトコードは、Cookie情報として有効なユーザデータを得るために使用することができる悪意のあるスクリプトコードを注入します。
PS:ユーザーが入力したデータは、セキュリティの形で表示され、それだけでページ上の文字列を表示することができます。
安全性データをマークすると、Djangoフレームワークを表示します(ただし、この操作は安全ではありません!):
-データはテンプレートページ上で取得しても安全に書き込まれた後----> {{XXXX |安全}}。
-バックグラウンドでインポートモジュール:django.utils.safestring輸入mark_safeから
文字列をページに渡されるセキュリティ処理を行う----> S = mark_safe(S)
XSS攻撃の実装は二つの条件が必要です。
まず、Webページに悪質なコードを挿入する必要があります。
第二に、これらの悪質なコードが正常にブラウザを実行することができます。
ソリューション:
1、この方法は、フォームまたはURLパラメータ渡し、必要なフィルタパラメータを提出することである前に。
図2に示すように、バックグラウンドでデータベースから取得した文字列データをフィルタリングし、それは、決定されたキーワードです。
3、セキュリティ・メカニズムを設定します。
Djangoフレームワーク:デフォルトでブロックされた内部機構。これは、入ってくる文字列が安全ではない、それは文字列をレンダリングし、表示されませんことを決定しました。安い手が安全で書かれている場合、それはあなたが安全に使用したい場合は、それがバックグラウンドで文字列フィルタをレンダリングするために行う必要があり、危険です。開発されたときに、それは、セキュリティ・メカニズムに注意して使用する必要があります。・特に、ユーザーが提出することができますし、コンテンツをレンダリングすることができます!!!
- 例:
<!DOCTYPE HTML> <HTML LANG = "EN"> <HEAD> <メタ文字コード= "UTF-8"> <タイトル> </ TITLE> </ HEAD> <BODY> <フォームメソッド= "POST" ACTION =」 /コメント/ "> <H4>评论</ H4> の<input type =" text」の名= "コンテンツ" /> <INPUT TYPE = "提出"値= "提交" /> {{エラー}} </フォーム> </ BODY> </ HTML>
<HTML LANG = "EN">
<HEAD>
<メタ文字コード= "UTF-8">
<タイトル> </ TITLE>
</ HEAD>
<BODY>
<フォームメソッド= "POST" ACTION =」 /コメント/ ">
<H4>评论</ H4>
の<input type =" text」の名= "コンテンツ" />
<INPUT TYPE = "提出"値= "提交" /> {{エラー}}
</フォーム>
</ BODY>
</ HTML>
<!DOCTYPE HTML> <HTML LANG = "EN"> <HEAD> <メタ文字コード= "UTF-8"> <タイトル> </ TITLE> </ HEAD> <BODY> <H1>评论内容</ H1> { MSGの%における項目の%} の<div> {{項目|安全}} </ div> {%ENDFOR%} </ BODY> </ HTML>
<HTML LANG = "EN">
<HEAD>
<メタ文字コード= "UTF-8">
<タイトル> </ TITLE>
</ HEAD>
<BODY>
<H1>评论内容</ H1>
{ MSGの%における項目の%}
の<div> {{項目|安全}} </ div>
{%ENDFOR%}
</ BODY>
</ HTML>
MSGは= []
:DEF(要求を)コメント
:request.method == "GET"場合
のリターンは(要求、 'comment.html')をレンダリングし
、他:
V = request.POST.get( 'コンテンツ' )
:V IN "スクリプト"があれば
):(要求、 'comment.html'、{ '小比崽子还黑我' 'エラー'}レンダリングを返す
それ以外:
msg.appendを(V)
(レンダリングリクエスト、「コメントを返します。 HTML ')
リターンレンダリング(要求、 'index.htmlを' { 'MSG':MSG})
from django.utils.safestring import mark_safe
temp = "<a href='http://www.baidu.com'>百度</a>"
newtemp = mark_safe(temp)
return render(request,'test.html',{'temp':newtemp}
from django.shortcuts import render msg = [] def comment(request): if request.method == "GET": return render(request,'comment.html') else: v = request.POST.get('content') if "script" in v: return render(request,'comment.html',{'error': '小比崽子还黑我'}) else: msg.append(v) return render(request,'comment.html') def index(request): return render(request,'index.html',{'msg':msg}) def test(request): from django.utils.safestring import mark_safe temp = "<a href='http://www.baidu.com'>百度</a>" newtemp = mark_safe(temp) return render(request,'test.html',{'temp':newtemp}
xss攻击:----->web注入
定义:
xss跨站脚本攻击(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。
我们常常听到“注入”(Injection),如SQL注入,那么到底“注入”是什么?注入本质上就是把输入的数据变成可执行的程序语句。SQL注入是如此,XSS也如此,只不过XSS一般注入的是恶意的脚本代码,这些脚本代码可以用来获取合法用户的数据,如Cookie信息。
PS: 把用户输入的数据以安全的形式显示,那只能是在页面上显示字符串。
django框架中给数据标记安全方式显示(但这种操作是不安全的!):
- 模版页面上对拿到的数据后写上safe. ----> {{XXXX|safe}}
- 在后台导入模块:from django.utils.safestring import mark_safe
把要传给页面的字符串做安全处理 ----> s = mark_safe(s)
实施XSS攻击需要具备两个条件:
一、需要向web页面注入恶意代码;
二、这些恶意代码能够被浏览器成功的执行。
解决办法:
1、一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤。
2、在后台对从数据库获取的字符串数据进行过滤,判断关键字。
3、设置安全机制。
django框架:内部机制默认阻止了。它会判定传入的字符串是不安全的,就不会渲染而以字符串的形式显示。如果手贱写了safe,那就危险了,若想使用safe,那就必须在后台对要渲染的字符串做过滤了。所以在开发的时候,一定要慎用安全机制。尤其是对用户可以提交的并能渲染的内容!!!
- 示例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <form method="POST" action="/comment/"> <h4>评论</h4> <input type="text" name="content"/> <input type="submit" value="提交" />{{ error }} </form> </body> </html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="POST" action="/comment/">
<h4>评论</h4>
<input type="text" name="content"/>
<input type="submit" value="提交" />{{ error }}
</form>
</body>
</html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>评论内容</h1> {% for item in msg %} <div>{{ item|safe }}</div> {% endfor %} </body> </html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>评论内容</h1>
{% for item in msg %}
<div>{{ item|safe }}</div>
{% endfor %}
</body>
</html>
msg = []
def comment(request):
if request.method == "GET":
return render(request,'comment.html')
else:
v = request.POST.get('content')
if "script" in v:
return render(request,'comment.html',{'error': '小比崽子还黑我'})
else:
msg.append(v)
return render(request,'comment.html')
return render(request,'index.html',{'msg':msg})
from django.utils.safestring import mark_safe
temp = "<a href='http://www.baidu.com'>百度</a>"
newtemp = mark_safe(temp)
return render(request,'test.html',{'temp':newtemp}
from django.shortcuts import render msg = [] def comment(request): if request.method == "GET": return render(request,'comment.html') else: v = request.POST.get('content') if "script" in v: return render(request,'comment.html',{'error': '小比崽子还黑我'}) else: msg.append(v) return render(request,'comment.html') def index(request): return render(request,'index.html',{'msg':msg}) def test(request): from django.utils.safestring import mark_safe temp = "<a href='http://www.baidu.com'>百度</a>" newtemp = mark_safe(temp) リターンレンダリング(リクエスト、 'test.htmlという' { 'TEMP':newtempを}