0

ユーザーがデータをコピーして入力フォームに貼り付けると、次のような文字が表示されることがあります。

don’t," 開始引用符および "終了引用符など ...

私はこのルーチンを使用して、Web フォームのほとんどの入力をサニタイズします (少し前に書きましたが、改善も求めています)。

function fnSanitizePost($data) //escapes,strips and trims all members of the post array
{
    if(is_array($data))
    {
    $areturn = array();
    foreach($data as $skey=>$svalue)
    {
      $areturn[$skey] = fnSanitizePost($svalue);
    }
    return $areturn;
  }
  else
    {
      if(!is_numeric($data))
        {
            //with magic quotes on, the input gets escaped twice, which means that we have to strip those slashes. leaving data in your database with slashes in them, is a bad idea
            if(get_magic_quotes_gpc()) //gets current configuration setting of magic quotes
      {
        $data = stripslahes($data);
      }
        $data = pg_escape_string($data); //escapes a string for insertion into the database
        $data = strip_tags($data);  //strips HTML and PHP tags from a string
      }
        $data = trim($data);  //trims whitespace from beginning and end of a string
      return $data;
    }
}

上記のような文字がデータベースに保存されるのを本当に避けたいのですが、消毒ルーチンに正規表現の置換を追加する必要がありますか?

ありがとう、

-ニコラス

4

4 に答える 4

3

PHP の utf_decode関数をチェックアウトします。UTF -8 でエンコードされた ISO-8859-1 文字を含む文字列を、1 バイトの ISO-8859-1 に変換します。UTF 文字を取得しているようですが、データベースはそれらを処理できません。

別の解決策は、可能であればデータベースのエンコーディングを変更することです。

于 2009-02-27T19:28:18.350 に答える
1

私はついにこれらの文字を置き換えるためのルーチンを思いついた。問題のある文字列の一部を一度に1文字ずつ解析し、各文字の8進値を返す必要がありました。そうすることで、スマートクォート文字が3つの8進数値のセットとして返されることを学びました。文字列を解析するために使用したルーチンは次のとおりです。

$str = "string_with_smart_quote_chars";

$ilen = strlen($str);
$sords = NULL;

echo "$str\n\n";

for($i=0; $i<$ilen; $i++)
{
    $sords .= ord(substr($str, $i, 1))."  ";
}

echo "$sords\n\n";

文字列を「修正」するためのstr_replace()呼び出しは次のとおりです。

$str = str_replace(chr(226).chr(128).chr(156), '"', $str); // start quote
$str = str_replace(chr(226).chr(128).chr(157), '"', $str); // end quote
$str = str_replace(chr(226).chr(128).chr(153), "'", $str); // for single quote

私はこれらの検索/置換の配列を構築し続けるつもりであり、これらのタイプの文字の使用が増えるにつれて成長し続けると確信しています。

これらを置き換えるためのいくつかの定型ルーチンがあることは知っていますが、スクリプトが実行されているSolaris10プラットフォームではそれらのいずれにも運がありませんでした。

-ニコラス

于 2009-04-03T20:15:05.770 に答える
0

Zend Frameworkは、このための非常に優れたツールを備えていますZend_FilterZend_Filter_Input

于 2009-02-28T08:34:17.337 に答える