2011-06-18 11 views
3

誰でも、StackOverflowの回答や、HTML、JavaScript、PHPのユーザーからの投稿コンテンツをエスケープするための書籍を含むその他のリソースを教えていただけますか?html、javascript、およびPHPのユーザーが投稿したコンテンツをエスケープする方法の概要フローチャート

例えば、ユーザーがテキストボックスに情報を入力し、送信ボタンをクリックするとします。その後、テキストはJavaScriptによってページのdivに書き込まれ、GET経由でPHPに送信され、PHPによってMySQLデータベースに格納されます。

私は、良い、広い、しかし詳細な概要を探しているエスケープのすべてのさまざまなタイプの関与。フローチャートも役立ちます!

ありがとうございます!


ありがとう!私はチートシートのように、1)HTML表示のためにエスケープする、2)URLに入れてエスケープする、3)PHPにURLを送る、4)URLからデータベースにデータを挿入するセクションを探しています。各セクションには、1)潜在的な問題の状況やエスケープすべき文字の例、2)エスケープ方法の例、3)後で必要に応じて文字をデコードする方法があります。

利点は、他のユーザーが数多くの異なるサイトと回答、および例と解決策がないリソースを通過する必要がないように、エスケープに関する多くの例と解決策があるワンストップのソースです。私はそれが素晴らしいと思います。


このチャートは、PHP(および他のプログラミング言語)を使用してデータベースmysqlでエスケープ物事を挿入するには、これまで http://www.the-art-of-web.com/javascript/escape/

答えて

0

かなりよさそうだ、PreparedStatementsがあります。

divボックスに入力したユーザーを直接表示し、入力をエスケープして(HTMLタグが解釈されないように)、Point #4 in this articleをチェックするかGoogleを使用できます。

2

は、私はいつも、ない「GET」のユーザデータのために自分を「POST」を使用したい、と以下の説明はことを反映しているが、あなたはまだ私はどちらかの方法を下回る言うの約90%を使用することができます。だからここに行く...

一般的なルール:データをエスケープするときに "先を見越し"しないでください。直ちに必要な変換のみを行います。 Canonical example:データベース挿入時にHTMLのためにエスケープしないでください。例えば、 '&'が '& amp; amp;'に変わることになります。ラウンドトリップの後に。

一般規則:全体を通してUTF-8を使用してください。あなたは、誰かがそれにユニコードの省略記号を持つ電子メールからコピー貼り付けをしたときに初めてこれに感謝します。 (あなたはそれがどれほど頻繁に起こるのか驚くでしょう)典型的な設定が必要です。

  • PHP:はphp_value DEFAULT_CHARSET "UTF-8"
  • のMySQL:データベースを作成するときにUTF8を選択して、これはPHP/MySQLの/ HTMLバージョンと異なる場合があります。
  • HTML:<メタHTTP-当量= "コンテンツタイプ" コンテンツ= "text/htmlの;のcharset = UTF-8"/>

一般的なルール:適切unsanitizedこと(ただし、唯一の5つの場所があります。

  • (適切にタイプされた)データベースフィールド(つまり、UTF-8テキストフィールドまたはBLOBフィールド)の値。
  • PHP変数の値です。
  • Javascript変数の値です。
  • HTMLフォーム要素の 'value'属性の値。
  • HTML要素のtextNode子の内容です。

ユーザデータをに置きたい場合は、他のの場所にユーザデータを保存する必要があります。これは疑問の範囲を超えていますが、典型的な例では、正規表現を使用して、ASCII文字または数字ではないものをアンダースコアで置き換えることができます。ファイル名やHTMLの 'id'属性などの一意性が重要な場合は、墨塗りされた名前が一意であることを確認するために追加の作業が行われなければなりません(例:'a^b 'と' a ' & b 'は両方とも消毒され、' a_b 'が解決される)。私の応答の肉、

filename = original_filename; 
while(already_exists(filename)) {count++; filename = original_filename + count;} 

そして、最後に:

:固有のエスケープ機能が変更されていないユーザデータが行くことができ、これらのファイブ特別な場所にしてから、データを移動するために使用するための典型的な解決策は次のようになります
  • HTMLフォーム値属性 - > PHP $ _POST変数:エスケープする必要はありません。
  • PHP変数 - >データベースフィールド:PDO文を準備:

    $stmt = $db->prepare('insert into roundtrip (id, name) values (NULL, :data)'); 
    $stmt->execute(array('data' => $_POST['name'])); 
    
  • データベースフィールド - > PHPの変数:いいえ必要なエスケープが、PDOを使用するには、クエリの値をエスケープする声明を準備:

    $stmt = $db->prepare('select id, name from roundtrip where name = :data'); 
    $stmt->execute(array('data' => $_POST['name'])); // User data needs escaping. 
    while ($result = $stmt->fetch()) { 
        echo $result['name']; // DB result doesn't. 
    } 
    
  • PHP変数 - > JavaScript変数:json_encode:

    var data = <?php echo json_encode(data); ?>; 
    
  • PHP変数 - > HTML textNodeまたはフォーム値:はhtmlspecialchars:

    <div><?php echo htmlspecialchars(data); ?></div> 
    <input type="text" name="name" value="<?php echo htmlspecialchars(data); ?>"/> 
    
  • Javascriptを< - > HTMLのtextNodeまたはフォーム値:ブラウザの内蔵textNodeと。値は/機能属性:

    data = source_div.textContent; // Firefox 
    data = source_div.innerText; // Other browsers 
    target_div.textContent = data; // Firefox 
    target_div.innerText = data; // Other browsers 
    
    // To/from form element. 
    data = source_form.value; 
    target_form.value = data; 
    
    // Append to element. 
    target_div.appendChild(document.createTextNode(data)); // All browsers 
    
    // jQuery textNode 
    data = $('#source_div_id').text(); 
    $('#target_div_id').text(data); 
    
    // jQuery form value 
    data = $('#source_form_id').val(); 
    $('#target_form_id').val(data); 
    

は、それが常に全体HTML-> PHP-> DB-> PHPを通過することを確認するために、このような文字列を繰り返し往復テストを実行してください - > [Javascriptを - >]毎回まったく同じようにHTMLサイクルが繰り返されます:

&amp;ДЖäüöéè<script>…</script>™<i>bold</i> 

ここでは、どのようにしてエスケープするかをテストするスクリプトです。それは明らかにそれを実行する前に作成するID = 1のデータベース、名称「往復」と列「ID」と「名前」を有するテーブルと、単一の行を必要とする:

<?php 
$db = new PDO("mysql:host=$host;dbname=$dbname", $db_user, $db_password); 
$stmt_insert = $db->prepare(' 
update 
    roundtrip 
set 
    name = :name 
where 
    id = 1 
'); 
$stmt_select = $db->prepare(' 
select 
    name 
from 
    roundtrip 
where 
    id = 1 
'); 
if ($_POST['do'] == 'edit') { 
    $stmt_insert->execute(array('name' => $_POST['name'])); 
} 
$stmt_select->execute(); 
while ($result = $stmt_select->fetch()) { 
    $data = $result['name']; 
} 
?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>Roundtrip test</title> 
    <script type="text/javascript" src="/js/jquery-1.7.1.min.js"></script> 
    <script type="text/javascript"> 
     function copydiv() { 
      // Non-jquery: 
      //var source = document.getElementById('divdata'); 
      //var target = document.getElementById('copydiv'); 
      //if (typeof(source.textContent) != "undefined") { 
      // target.textContent = source.textContent; 
      //} else { 
      // target.innerText = source.innerText; 
      //} 

      // jquery: 
      $('#copydiv').text($('#divdata').text()); 
     } 
     function copyform() { 
      // Non-jquery: 
      //var source = document.getElementById('formdata'); 
      //var target1 = document.getElementById('copyform1'); 
      //var target2 = document.getElementById('copyform2'); 
      //if (typeof(source.textContent) != "undefined") { 
      // target1.textContent = source.value; 
      //} else { 
      // target1.innerText = source.value; 
      //} 
      //target2.value = source.value; 

      // jquery: 
      $('#copyform1').text($('#formdata').val()); 
      $('#copyform2').val($('#formdata').val()); 
     } 
     function copyjson() { 

      var data = <?php echo json_encode($data); ?>; 

      // Non-jquery: 
      //var target = document.getElementById('copyjson'); 
      //if (typeof(target.textContent) != "undefined") { 
      // target.textContent = data; 
      //} else { 
      // target.innerText = data; 
      //} 

      // jquery: 
      $('#copyjson').text(data); 
     } 
    </script> 
</head> 
<body> 
    <div>Data: <span id="divdata"><?php echo htmlspecialchars($data); ?></span></div> 
    <div>JS div copy: <span id="copydiv"/></div> 
    <div>JS form copy: <span id="copyform1"/></div> 
    <div>JSON copy: <span id="copyjson"/></div> 
    <form method="POST"> 
     <input type="hidden" name="do" value="edit"/> 
     <input type="text" name="name" id="formdata" value="<?php echo htmlspecialchars($data); ?>"/> 
     <input type="text" id="copyform2"/> 
     <input type="button" value="Copy div" onclick="copydiv();"/> 
     <input type="button" value="Copy form" onclick="copyform();"/> 
     <input type="button" value="Copy json" onclick="copyjson();"/> 
     <input type="submit"/> 
    </form> 
</body> 
</html> 
+0

ありがとうございます!ソリッドシンプルランニング – weather

0

OWASPカバーXSS Prevention Cheat Sheetを有しますあなたが探しているもののほとんど(すべて?)。 PHPに直接対処しません。

関連する問題