2015-12-14 9 views
6

私はHTML5 + Javascriptにいくつかのコードを書いています。ユーザーがUserに自分の名前を入力すると、それは "Hello <user>"のように戻ってきます。このスクリプトはXSS(クロスサイトスクリプティング)に脆弱です。私はペイロード"><img src=x onerror=prompt(404)>を入力したときに今、私はXSSのプロンプトを取得次のコードでXSSを防止するにはどうすればよいですか?

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="utf-8"/> 
<title>Forms Welcome</title> 

<script> 
function write_name(){ 

    var welcome_parra = document.getElementById('welcome'); 
    var name = document.getElementById('name'); 
    welcome_parra.innerHTML = "welcome " + name.value; 
} 
</script> 
</head> 

<body> 
    <p id="welcome"></p> 
    <form> 
     Username: <input type="text" name="username" maxlength="20" id="name"/> 
     <input type="button" value="done"onclick="write_name();"> 
    </form> 
/body> 

</title> 

は、ここに私のコードです。だから私はそれをどのように修正するのですか?

誰でもホストをチェックして、バグにパッチを当てて理由を教えてください。

+0

こんにちは!ようこそstackoverflowへ! 私はあなたの質問を編集しました。外部リンクではなく、あなたの質問にコードを書くべきです:D – Zorgatone

+0

誰もテキストを入力して、ユーザーから離れてボタンをクリックすることができないので、XSSに対して脆弱です。それは一種の["self XSS"](https://en.wikipedia.org/wiki/Self-XSS)だと思いますが、それは開発者ツールを使って行うことができます。 – SilverlightFox

+0

はい、Stored XSSではなく、Self XSSです。しかし、開発者として、私たちもそれを防ぐ必要があります:) @SilverlightFox –

答えて

4

あなたが試みることができる次

function checkInput(string) { 
    var regex = /^[^0-9*\\\^\/<>_#']+$/; 
    if(regex.test(string)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

あなたは文字がXSS攻撃のために使用されているかどうかを確認してから、ちょうど私もこれを使用する上記の代わりに、フォーム

を送っていけないでしょう。この道をフォームの検証のための関数:

checkField:function(string, type) { 
    var regex; 
    switch (type) { 
     case "number": 
      regex = /^[\d]+$/; 
      break; 
     case "string": 
      regex = /^[^0-9*\\\^\/<>_#']+$/; 
      break; 
     case "email": 
      regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,7})+$/; 
      break; 
    } 
    if (regex.test(string)) { 
     return true; 
    } 
    return false; 
}, 

あなたが望むだけ多くのケースを追加することができます。

xss攻撃の100%安全であるためには、サーバー上のフォームを検証する必要があるため、2つの単純なルールに従います。
ルール番号1:決してフォームデータを使用しないでください。チェックしない
ルール番号2:スクリプトやコードに関連する部分(<%>/\など)を置換せずにフォームデータを使用しない

フォームを単純にコピーして正確なアドレスに送信できるので、クライアント側のチェック/検証が必要ですが、フォームをどこか別の場所に送信してはいけないので、コードを入力するだけで十分です。

UP DATE:

Javascriptがちょうど警告ウィンドウに1を与えるインスタンス

(+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]]]+[+!+[]]+([][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!+[]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!+[]+[])[+[]]+(!+[]+[])[!+[]+!+[]+!+[]]+(!+[]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]])() 

ため、brainfuckベースにいくつかの空想のXSS攻撃をコンパイルするには...

これらの使用文字はaswell

をチェックする必要があります
+0

@TeaTimeありがとうございます。はい、フォームの検証も役に立ちました。私はHTMLもエンコードしましたが、これもうまく動作します。 –

6

入力をHTMLエンコードしてXSSに安全にすることができます。

function escapeInput(input) { 
    return String(input) 
      .replace(/&/g, '&amp;') 
      .replace(/"/g, '&quot;') 
      .replace(/'/g, '&#39;') 
      .replace(/</g, '&lt;') 
      .replace(/>/g, '&gt;'); 
} 

そしてエンコードユーザー入力:機能を追加

それは非常に簡単です
<script> 
function write_name(){ 

    var welcome_parra = document.getElementById('welcome'); 
    var name = document.getElementById('name'); 
    welcome_parra.innerHTML = "welcome " + escapeInput(name.value); 
} 
</script> 
+0

それを試してみました。助けてくれたPavel Morshenyukさんありがとうございました:) –

0

、ちょうどinnerText代わりのinnerHtmlに割り当てます。

welcome_parra.innerText = "welcome " + name.value; 
関連する問題