2012-03-21 28 views
4

私はhtmlテーブルにカメラ名のリストを持っています。必要に応じて、編集ボタンを押してカメラ名を編集することができます。特殊文字がありません

これで、カメラ名を編集できるようになりました(これ以外にも多数のオプションがあります)。

var edit = function(t, to, cameratype, cameraname, ...) 
{ 
    var mydiv = js("#editform"); 

    if (mydiv.find("form").length) { 
     mydiv.show(); 
    } else { 
    // fields 
    var $myform = js("<form id='EditCameraForm' name='' method='post' action='" + to + "'></form>"); 
    var $myfieldset = js("<fieldset><legend>Edit camera settings</legend></fieldset>"); 
    var $myinput = js("<input type='hidden' name='camera_type' value='" + cameratype + "' />"); 
    var $mylabel = js("<label for='CameraName'>Camera name:&nbsp;</label>"); 
    var $myinput2 = js("<input id='CameraName' name='camera_name' size='25' value='" + cameraname + "' />"); 

    $myform.append($myinput, $mylabel, $myinput2, ...); 
} 

私の問題はカメラマンになります。私は特殊文字を許可します。カメラJoe's cameraに電話することができます。

編集ボタンを押すと、カメラ名はJoeと表示されます。

これはカメラ名が最初に作成されたときにPHPで私の検証機能に関係しています...私は信じている:

function check_input($data) 
{ 
      $data = trim($data); 
      $data = stripslashes($data); 
      $data = mb_convert_encoding($data, 'UTF-8', 'UTF-8'); 
      $data = htmlentities($data, ENT_QUOTES, 'UTF-8'); 

      return $data; 
} 

cameranameは、ボタンのクリックを経由して渡されます。

<button id="editbutton" onClick='edit(this, "<?php echo htmlentities($_SERVER['REQUEST_URI']); ?>", "<?php echo $result_cameras[$i]["camera_type"]; ?>", "<?php echo $result_cameras[$i]["camera_name"]; ?>", ...)'>Edit</button> 

このページのソースを表示すると、Joe&#039;s cameraと表示されます。だから、おそらく私はdecodeURIComponent(カメラマン)とJSコードでこれをデコードする必要があると思ったが、それは動作しません。助けてくれてありがとう!

+0

あなたの質問に答えることはできませんが、検証機能を捨てれば、データが破壊されますが、SQLインジェクションに対して十分な保護を提供することはできません。 –

+0

投げ捨てる? XSS(@JMack修正)を防ぐためのこの一般的なテクニックは、mysql_real_escape_stringのようなSQL用のmysql関数を使用していますか? – Tom

+0

関数内の呼び出しは有用ではないようです。逆に、 'stripslashes()'呼び出しはデータを破壊することさえあります。 'htmlspecialchars()'はXSS(全てのエンティティを変換する必要はありません)を防ぐのに必要な唯一のものです。データを出力するときにそれを適用すれば十分です。mysql_queryのデータを使用する場合は 'mysql_real_escape_string () 'を返します。 –

答えて

1

あなたのような入力ボックスを構築する代わりに、もう少しJqueryを使用してみてください。

var $myinput = js('<input/>').attr('type','hidden').attr('name','camera_type').val(cameratype); 

あなたの問題は、あなたがvalue='" + cameratype + "'セクションに二重引用符の問題を作成している可能性が高いです。

+0

ああ、完璧、これのためにありがとう。 – Tom

+0

更新する必要がある場所がもう1つありますが、書き直す方法がわかりません: 'window.open(" file.php?user = "+" <?php echo $ id_hash;?> '+ "&camera =" + "+"カメラ名+ "+"カメラ名+ "+モーション=" +カメラマン "、"モニター ");あなたが提案できるものは何ですか? – Tom

+0

変数を 'encodeURIComponent()'でラップしてみてください。 – AndrewR

1

このコードにはいくつか問題がありますが、それが疑わしいと思うので、check_input()関数を使い始めることができます。

マジッククォートがオンであることがわかっている場合は、にしてください。 UTF-8からUTF-8までmb_convert_encoding()を実行していますか?それには理由がありますか? htmlentities()が働いていますが、あなたはhtmlspecialchars()がほしいと思います。

function check_input($data) 
{ 
    $data = trim($data); 
    $data = (get_magic_quotes_gpc()) ? stripslashes($data) : $data; 
    $data = htmlspecialchars($data, ENT_QUOTES, 'UTF-8'); 

    return $data; 
} 

TomPepernicは言った:

ない私は理解してくださいを。 $ camera_name = check_input($ _ POST ['camera_name']);その後、mysql_real_escape_stringを使用してDBに挿入されます。これは間違っています? - トムPepernic 2時間前

@TomPepernic多くの疑問と同じように、プログラムの完全な範囲を知らなくても、決定的な「右」か「間違った」答えを与えることは困難です。経験から、多くの場合、しばしば受け入れられると考えられるが、それはめったに最適なソリューションではないことを伝えることができます。

最初に単一の衛生状態に基づいてプログラムが悪意のあるデータから「安全」であると仮定すると、欠陥のあるモデルになります。可能なすべてのデータアウトレットを知ることはほとんど不可能であるため、1つの方法ですべてを有効にする方法ではサニタイズできません。プログラムの冒頭で、あなたはHTMLのために消毒していますが、それだけです。後であなたのプログラムでは、墨塗りが無効であったため、SQLのためにエスケープする必要があります。後であなたがSQLではない別のデータベースタイプに格納することを決めた場合はどうなりますか?その特定のデータベースに対してもう一度サニタイズする必要があります。より良い方法は、データがすべての単一レベルで汚染されていると仮定し、必要に応じてコンセントに達する直前に消毒することです。

もう1つの理由は、プログラムのPHP部分でHTMLのサニタイズを行うためです。この段階では、悪意のあるデータがPHPに損害を与えることはほぼ不可能です。あなたのPHPコードとあなたのHTMLコードは別々でなければならないので、あなたは間違った言語のために消毒しています。HTMLのサニタイズは、(MVCのアプローチを使用していると仮定して)プログラムの「ビュー」部分に来るはずです。

私があなたを退屈させる最後の理由は、データを処理する前にデータを変更していることです。一般的に、元のデータを使用して元のデータを保存することをお勧めします。データを変更した後、後で必要になった場合は、データを回復するのがより困難または不可能です。私はこれを何年も前に覚えました。私は、独自のBBcode構文を使ってテキストフォーマット、画像、リンクを追加する小さなフォーラムアプリケーションを開発しました。私はそれを保管する前に私のデータを浄化し、処理した。後でその行の下で、文法に問題があることを発見しました。その理由は、いくつかの投稿が不適切に表示されていたためです。私は自分のコードで修正を加えることができました。これは将来のすべての投稿に対して適切に機能します。残念ながら、問題の影響を受けていた以前のすべての投稿を修正することはできませんでした。なぜなら、それらを壊れた処理された形式で保存していたからです。私がオリジナルを保管していれば、私はそれらを再処理することができ、データは失われませんでした。

+0

ありがとうございます。私はもっ​​と注意を払うべきです。私はhtmlspecialcharsを持っていたが、間違ったコードを切り取って貼り付けると誓っている。残りの私は言い訳がありません;) – Tom

+0

@TomPepernicあなたの関数の名前は "check_input()"ですが、実際にはそうではありません。この関数は書式設定を行っています。私はそれを "sanitize_input()"、 "clean_input()"、または同様の名前にすることをお勧めします。 –

+0

@TomPepernicまた、関数内でhtmlspecialchars()を使用して、処理前に入力を消去しているようです。これは経験の浅いユーザがPHPで作る一般的な落とし穴です。あなたは作業を必要とするデータを変更しているため、最初は入力をサニタイズしようとは思わないし、とにかくここであなたを正しく保護しないかもしれない。生データを取り出し、必要に応じて処理したいとします。ページに印刷する前にhtmlspecialchars()を使用し、データベースに挿入する前にmysql_real_escape_string()を使用してください。 –