0

私は素晴らしい開発者ではないので、ご容赦ください。クラスと関数を使い始めたので、ライブラリを作成する方法がとても気に入っています。すべての PHP を使用できる 1 つのページ。私は考えていましたが、構文内の関数の変数をチェックし、関数を実行する前にそれらをすべてエスケープできれば、私の人生は何百万倍も楽になるでしょう。そうすれば、関数ごとに各変数をエスケープする必要がなくなります。

関数内の変数を何らかの形でチェックして確認し、それらをエスケープできるようにする必要があります。

so X = 'Variable for a function' 
   X = mysqli_real_escape_String($conn, X);

これが可能かどうか誰か教えてください。そうでない場合は、他にどのようなオプションを提案できますか?

PS 私はまだ PDO を使用するのに十分なほど進んでいないので、手続き型プログラミングへのアドバイスを守ってください。

申し訳ありませんが、おそらくこれを正しく説明していません。私がやろうとしているのは、誰かが関数 ($vars) を呼び出したときに発生するライブラリ内の変数をエスケープする必要をなくすことです。そのため、関数が実行される前に $vars をチェックしてエスケープする __construct 内にある種のスクリプトを作成するという考え方です。

class users
{
function __construct()
{
   //the idea is that i can somehow escape the variables within the function
   //for the function that's being called
    function magical_funtion_that_calls_all_variables()
    {
        foreach($var)
        {
            $var = mysqli_real_escape_string($conn, $var);
        }
    }
}

function register($user, $pass1, $pass2)
{
4

3 に答える 3

1
function escape_vars(array &$arr) {
  function ev(&$var) {
    $var = '*'.$var;
  }
  array_walk_recursive($arr,'ev');
}

この関数は、参照によって渡される値の多次元配列を受け入れ、すべての値を変更する配列内の各値に対して関数を実行します。そうしないでください。

準備済みステートメントを使用します。ここに手続き型のスタイルの例があります:

http://us1.php.net/manual/en/mysqli.prepare.php

于 2012-12-16T05:07:15.900 に答える
0
class users
{
  public function __construct()
  {
     //this is to set up the class you dont want to escape values until just before you
     // execute a query!
  }

  public function register($user, $pass1, $pass2)
  {
     // DO THE ESCAPING HERE
     $user = mysqli_real_escape_string($conn, $user);
     $pass1 = mysqli_real_escape_string($conn, $pass1);
     $pass2 = mysqli_real_escape_string($conn, $pass2);

     //now do your query
  }
}

何を求めているのか100%明確ではありませんが、タイプを確認したいだけだと思います。たとえば:

if(is_string($x)) {
  $x = mysqli_real_escape_string($x);
}

したがって、コンストラクターのコンテキストでは次のようになります。

public function __construct() {
   $args = func_get_args();
   foreach($args as $key => $arg) {
      if(is_string($arg) {
         $args[$key] = myqli_real_escape_string($arg);
      }
   }
}

$args前の例の問題は、コンストラクター定義で定義した可能性のある「名前付き」パラメーターの代わりに、数値インデックス付き配列を使用する必要があることです。

したがって、実際にすべきことは、すべてのパラメーターを手動でチェックすることです。約 5 つ以上ある場合は、何か間違ったことをしているので、これはそれほど大きな頭痛の種ではありません。

つまり、クラスを拡張しようとしている場合を除いて、Mysqli の PDO または OO API を使用することは、関数を使用することよりも難しくありません。だから私はまだそれらを使用することをお勧めします. 手続き的なコンテキストでも、IMO は物事をはるかに簡単にします。

特定の例の場合、エスケープとクエリ(ステートメント)の再利用に役立つ準備済みステートメントを実際に使用する必要があります。mysqli は、物事を参照する必要があるため、ここで扱うのは少し難しいです。

于 2012-12-16T04:09:40.623 に答える
0

あなたがしていることは良い解決策だとは思いません。エスケープしたくないパラメーターを渡したい場合はどうなりますか? これが必要な唯一の本当の理由が怠け者だからである場合 (私たち全員がそうです...)、独自の「ラッパー」メソッドを作成して、1 回の簡単な呼び出しで値をエスケープできます。

そのような:

class User
{
    public function register($user, $pass1, $pass2)
    {
        list($user, $pass1, $pass2) = $this->escape($user, $pass1, $pass2);
        ...
    }

    private function escape()
    {
        $args = func_get_args();
        foreach ($args as &$arg)
        {
            $arg = myqli_real_escape_string($arg);
        }
        return $args;
    }
}

PS: 他の誰もが示唆しているように、準備済みステートメントを使用することを強くお勧めします。最初は怖いですが、コツをつかむのは非常に簡単で、潜在的なセキュリティ リスクを排除します。

まったくお勧めしませんが、探していることを正確に実行できる1つの方法を次に示します。

class User
{
    public function __call($methodName, $args)
    {
        foreach ($args as &$arg)
            $arg = myqli_real_escape_string($conn, $arg);

        call_user_func_array(array($this, $methodName), $args);
    }

    private function register($user, $pass1, $pass2)
    {
        // $user, $pass1, $pass2 will all be escaped
        ...
    }
}
于 2012-12-16T05:02:55.060 に答える