2017-11-28 5 views
0

私のサーバーに入るAJAXリクエスト入力を全面的にサニタイズできる関数を作成しようとしています。ここまでで私はこれを作成しました:Previous JSON解決策が検出されない

function sanitize($variable) { 
    switch(gettype($variable)) { 
     case "string": 
      //// 
      $variable = trim($variable); 
      $variable = stripslashes($variable); 
      $variable = htmlspecialchars($variable); 
      break; 
     case "array": 
      foreach($variable as $key => $property) { 
       $variable[$key] = sanitize($property); 
      } 
      break; 
     case "object": 
      foreach($variable as $key => $property) { 
       $variable->$key = sanitize($property); 
      } 
      break; 
    } 
    return $variable; 
} 

これは、通過できるネストされた配列、オブジェクト、および文字列を完全に消毒するために素晴らしい機能を果たします。しかし、コメントアウトされた行にJSON解析サポートを追加したいので、私は解決策をインターネットに持ってきました。

$unstrung = json_decode($variable); 
if(is_object($unstrung)) sanitize($unstrung); 

$unstrung = json_decode($variable); 
if(json_last_error() == JSON_ERROR_NONE) sanitize($unstrung); 

if(!is_array(json_decode($variable, true))) sanitize(json_decode($variable)); 

しかし、これらのそれぞれが、特定の状況では、文字列内の引用をコードする文字を終わった:私は、コメント行の代わりにこれら三つの提案されたソリューションのそれぞれを試してみました。例えば、同じようにコード化されたデータをJSON.stringify(["data"])に送信し、私のサーバがこの関数を使用してそれを消毒し、直ちに吐き出すと、"["data"]"のような応答が得られます。なぜ私はこれを取得していますか?

+0

なぜこれをやっていますか?最終目標は何ですか? – c69

+0

私の衛生機能がJSONを認識して解析し、その結果をサニタイズできるようにしたい。このサポートを私の関数に追加しようとすると、私の投稿の最後に記載されているように、いくつかの文字列がどのように処理されているかが分かりませんでした。 –

+0

..安全でないHTMLのキーと値をサニタイズしたいのですか? – c69

答えて

0

これはあなたの犯罪者である:

htmlspecialchars()$variable = htmlspecialchars($variable);あなたは、具体的ENT_NOQUOTESとしない、それにフラグを付けない限り、そのようなあなたの二重引用符をかむために起こっています。

この文字列を使用してデータベースに与えるセキュリティへの影響が最も懸念される場合は、ユーザーデータを使用してクエリを実行するときにプレースホルダでprepared statementを必ず使用してください。我々は(それがかなり広いだけでなく、あなたの質問になるだろう)、あなたのプロジェクトについて十分に知らないので、私たちが提案するために、以前(前あなたのクエリプロセスに)消毒方法を提供

は困難です。

この情報を参考にすれば、プロジェクトに進むための十分な情報が得られればと思います。

関連する問題