2009-02-27 6 views
0

時には、ユーザが入力フォームにデータをコピー&ペーストしたとき、我々は次のような文字を取得します:着信文字列からすべての迷惑メールを削除するためのルーチン?

は引用符を開始し、â終了引用符などのための€のための“、€の™tをdid notの縮約形...

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; 
    } 
} 

私は本当に私がから上記の言及のように文字を避けたい:私は(私はしばらく前にそれを書いただけでなく、改善を探しています)は、Webフォーム上で最も入力をサニタイズするために、このルーチンを使用

これまでに得たgデータベースに格納されている場合、サニタイズルーチンに正規表現置換を追加する必要がありますか?

おかげで、

-ニコラス

+0

それはスマートな引用の問題であるが、明らかにこれはのみMS Wordのは、切断/貼り付けに関与しているときに表示ように見える問題です。私はデシベルに入る前に、これらを交換したい場合は 私は、文字やそのコードの配列を作成する必要がありますか? (â€のœまたはその数値?) –

答えて

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 

私はこれらの検索の配列を構築継続するつもりです/私が確信している交換は、これらのタイプの文字の使用が増えるにつれて、ますます大きくなるでしょう。

は、私はこれらを交換するためのいくつかの缶詰のルーチンがあることを知っているが、私は私のスクリプトが実行されているのSolaris 10プラットフォーム上でそれらのいずれかとは運がなかったです。

- ニコラス

+0

+1私も年齢とともにこれを苦労しました。興味深いことに、私はあなたが説明したchar-by-char分析と同じものを使って見つかった3つのcharコード226,128,156を検索して答えを見つけました。 –

3

あなたはPHP's utf_decode機能をチェックアウトするには:シングルバイトISO-8859-1にUTF-8でエンコードされたISO-8859-1文字の文字列に変換します。あなたがUTF文字を取得しているようで、データベースはそれを処理できません。

可能であれば、データベースのエンコーディングを変更する方法もあります。

+0

ちょうど私が理解して確保するために、データベースのエンコーディングを変更するだろうが自動的にこれらの文字が変換またはちょうど許可されていないことが原因?明らかに、様々なソースからのコピー/貼り付けの結果ですが、間違いなく「修正」する必要があります。 –

+0

データベースに既にある値は、UTF文字として認識されません。変更後にデータベースを再作成したり、スクリプトを実行して更新したりする必要があります。 –

+0

は、従来システムと同様の経験をしたしたので、あなたはおそらく今、あなたのDBを更新する多くの時間を節約します。私はbobinceに同意し、すべてをUTF8に更新します。 – GloryFish

6

はジャンクではありません終了引用符

のための引用符を開始し、â€のために、それらはUTFとしてエンコードあなたに渡された合法的な「スマート引用符」文字である“、€の™tをdid notの縮約形-8、ただしISO-8859-1と誤って読んでいます。

utf_decodeを使用して、それらを取り除くか、普通の古いLatin-1に解析しようとすることはできますが、もしあなたがASCII以外のものを入力できないようなアプリケーションがあれば日と年はかなり貧しいショーです。

すべてのページをUTF-8として提供し、すべてのフォーム提出物をUTF-8として受信し、すべてのデータベースコンテンツをUTF-8として保存することをお勧めします。理想的には、アプリケーションはすべてのUnicode文字で内部的に動作するのが理想的ですが、言語としてのPHPにはネイティブのUnicode文字列がないため、通常はすべての文字列をUTF-8として保持することもあります。あなたがmbstringを手放したい場合を除き、UTF-8シーケンスとgettingを得ること。

$ data = pg_escape_string($ data); //データベースに挿入する文字列をエスケープします

$ data = strip_tags($ data); //文字列からHTMLタグとPHPタグを取り除く

あなたのアプリケーションに適用される殺菌対策としては行いたくないです。すべての文字列をプレーンテキスト形式で保持し、Postgresクエリへの途中でのみpg_escape_string()を、HTMLページへの途中ではhtmlspecialchars()を使用します。

そうしないと、スクリプトから出力ページに直接渡された変数にSQLエスケープが現れるなど、奇妙なことが起こります。誰も普通の小文字を使用することはできません。

便利なことには、文字列内の制御コードを削除することです(改行以外の、おそらくあなたが望むかもしれない)。

$data= preg_replace('/[\x00-\x09\x0B-\x19\x7F]/', '', $data); 
+0

(特別な場合のために)いくつかのstr_replaceに加えて、このアプローチは非常にうまく働いています。その完璧ではないが間違いなく良い。ありがとうございました。 –

0

Zend FrameworkZend_FilterZend_Filter_Inputこのために非常に良いツールを持っています。

+0

どのZend_XXXフィルタがこの問題に対処していますか?私は適用されたものを見つけることができませんでした。 –

関連する問題