3

序文:

フォームとテキストフィールドを含むWebページがあります。

1)送信時に、フィールドのテキストはajaxでphpスクリプトに送信されます(GETメソッドを使用)。

2)phpスクリプトはテキストを取得し、それをパラメーターとしてシェルツールに渡します。

3)シェルCツールは、 argcをunicharの配列に解析します(実際には、現在の実装ではNSString)。

4 .. 5 .. 6 ..次に、ツールは彼の仕事を行い、phpスクリプトがWebページへの応答として機能するという結果をstdoutに返します...

コンテンツが適切にエンコードおよび保存され、セキュリティの問題が発生しないように、各ステップを実行するための正しい/標準的な/「ユニコード」の方法を探しています。

私が今していること:

1)(JavaScript)テキストはこの方法でフォームから取得されます

theText = $('#theField').attr('value');

この方法でサーバーに送信されます

httpReq.open('GET','myScript.php?theText=' + encodeURIComponent(theText),true);

2)(PHP)テキストを取得します

$theText=(isset($_GET["theText"])?$_GET["theText"]:"");

私はCツールと呼んでいます

$cmd = "/usr/bin/thetool -theText ".escapeshellarg($theText);
echo shell_exec( $cmd );

3)(Objective-C)私はMacOS Xを使用しているので、NSStringクラスとNSUserDefaultsクラスを利用します(ただし、最終的にユニチャーの配列になると仮定すると、プレーンなCソリューションも適しています)

int main(int argc, const char * argv[])
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString       *theText =      [userDefaults stringForKey: @"theText"];

質問

これは良い方法ですか?

shell_execを呼び出すとき、 escapeshellargだけで安全ですか?

ユーザーが何か奇妙なものを入力すると、途中でいくつかの文字が失われますか?

4

1 に答える 1

1

有能な返事を待って、私はいくつかの経験的なテストを始めました...

最初に変更しました

echo shell_exec( $cmd );

echo $cmd;

フォームに入力されたさまざまなテキストがコマンドライン呼び出しでどのように表示されるかを確認します。PHP側のescapeshellargはうまく機能しているようです。

ツールに渡されるテキストは、常に一重引用符で囲まれ、「危険な」文字は適切にエスケープされているようです。ツールの呼び出しを改ざんする方法が見つかりませんでした。

次に、渡されたテキストをテストして、どこかで何かが失われていないかどうかを確認しました。

このようにCツールを設定し、出力を探しました

int main(int argc, const char * argv[])
{
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString       *theText =      [userDefaults stringForKey: @"theText"];

    int i;
    unichar c;

    for(i=0;i<[theText length];i++)
    {
        c = [searchString characterAtIndex:(NSUInteger) i];
        printf("%d\n",c);
    }

    return 0;
}

いろいろ試してみました。それはすべて大丈夫のようです。最後のテストとして、フォームに「MUSICALSYMBOLGCLEF」と入力しました

http://www.fileformat.info/info/unicode/char/1d11e/index.htm

いくつかのユニチャー*としてツールに正しく終了することが判明しました

55348 56606

(*これは、コードが65535を超える非常に特殊な文字であるため、いくつかの代理ユニチャーで表す必要があります。これは、私が見つけた最もエッジのあるケースです)。

とにかく、最初に述べたように、これらは単なる経験的なテストです。何十ものテストに合格したからといって、賢明なコードが良いとは思いません。コメントや提案(または警告!)を受け取ってとてもうれしく思います。

MacOSXでテストしました-クライアント側のFirefox-MacOSX-サーバー側のMamp。

于 2013-01-04T19:15:23.473 に答える