は、私はいつも、ない「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サイクルが繰り返されます:
&ДЖäüöéè<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>
ありがとうございます!ソリッドシンプルランニング – weather