2012-03-26 7 views
1

このmysql_real_escape_stringは、現在どのDBサーバが担当しているのですか?

$rs = getrs($dbh,"select firstname,lastname from users where userid='" . safe($uid) . "'") 

のような関数呼び出しでは、安全機能が正常にSQLインジェクションを扱うでしょうか?

safe関数は、基本的には渡された引数(この場合は$ uid)にmysql_real_escape_stringを適用するだけです。

もしそうなら、私はどのように見えません。

データベースハンドル$dbhと機能safe()が異なるコンテキストで実行されているため、どのように動作するのかわかりません。

安全なような関数にラップされたすべての変数が適切にエスケープされていることを確認しながら、上記の1つのライナーのような便利な関数を書く方法がありますか?

また、PHPには4dbhを渡す関数があり、それがmysqlハンドルかmssqlハンドルかを教えてくれますか? SQLが適切にエスケープされるためには

+0

[mysql_real_escape_string](http://php.net/manual/en/function.mysql-real-escape-string.php)は、リンク識別子である第2のパラメータ(オプション)を受け入れます。開いている接続のハンドルを明示的にこの関数に渡す必要があります。 –

答えて

1

を使用mysql_real_escape_stringのは、サーバが、現時点では担当 であるデシベル知っているのですか? manualから

リンクIDが指定されていない場合、 にmysql_connect(で開かれた最後のリンク)が想定されます。そのようなリンクが見つからない場合、mysql_connect()が引数なしで呼び出されたかのように を作成しようとします。 接続が見つからないか確立されていない場合、E_WARNINGレベルのエラーは です。

[...]

セーフ機能が正常にSQLインジェクションを扱うでしょうか?

具体的にはそうです。

は確認しながら 関数のように安全に包まれているすべての変数が適切にエスケープされている上記1つのライナー のような便利な機能を書くための方法があります。

これにはsprintfを使用する人がいます。ただし、これを行う正しい方法は、パラメータ化されたクエリ(PDO)を使用することです。

、あなたが4dbhを渡し、それが それはMySQLのまたはハンドルMSSQLかどうかを示しますことも、PHPでの関数は、ありますか?

あなたは別に、マニュアルページを読むことによってだけ答えることができる愚かな質問からget_resource_type

$dbh = mysql_connect(); 
echo get_resource_type($dbh); // mysql link 
+0

すべてをカバーしてくれてありがとう。私はPDOを使いたいですが、getrs関数のように1行にすることはできませんでした。安全な選択、更新、挿入を行うには、1つまたは2つのライナーがたくさんあるpdoライブラリがありますか? –

+0

@Johnあなたのgetrs関数は真の1ライナーではありません。 mysql_query呼び出しとの違いは? –

0

http://php.net/manual/en/pdo.prepared-statements.php

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 
+0

Juan、なぜPDOがmysql_real_escape_stringより優れていますか?私は、マルチバイト文字を扱うことは決してありません。私は常にUTF-8に固執しています。なぜ私はPDOに変更する必要がありますか? –

+0

@JohnSmith別のドライバ(mysqlではなく)を使用すると、そのドライバに対して正しいエスケープメカニズムが使用されます。 –

+0

OK。しかし、 "mysql以外のドライバ"や "utf-8以外の文字セット"に入る予定がない場合は、PDOではなくmysqlを使う方が良いとは限りません。限り、SQLインジェクションまで、彼らは同一であり、パフォーマンスが行く限り、私は、mysqlは、PDOがプリペアドステートメントでroud旅行の場合、特定のステートメントを実行するPDOに勝つと思う。 –

0

を使用することができ、述べてはるかに重要な問題がある:

でしょうsafe関数は、適切にSQLインジェクションを処理する?

限りsafe()としての機能は基本的に渡される引数の上にmysql_real_escape_stringのを適用するが、何もしない、それはこのように命名すべきではありません。 mysql_real_escape_stringを適用することは、注入や安全性とはまったく関係がないためです。

少なくともこの関数は、エスケープに加えて、渡された値の周りに二重引用符「」を追加する必要があります。いくつかのクエリは誤っていますが、少なくとも安全です。

安全な関数にラップされたすべての変数が適切にエスケープされていることを確認しながら、上記の1つのライナーのような便利な関数を書く方法がありますか?

確かに。
プレースホルダを使用します。

$rs = getrs($dbh,"select firstname,lastname from users where userid=?",$uid); 

カスタムハンドラは、プレースホルダ?を安全に準備された値に置き換えます。

ここでは、あなたの "oneliner"と同じ意図で長らく書いた機能ですが、安全性と使いやすさを念頭に置いたより賢明な機能です。
確かに理想的ではありません - %のprintf構文を使用しているため、クエリに直接charを配置する必要はありません。また、識別子のプレースホルダ(他の多くの便利なプレースホルダ)はありません。もちろん、OOPの実装ははるかに柔軟で、醜い "モード"変数の代わりにきちんとした別個のメソッドを持っています。
しかし、あなたが機能

function dbget() { 
    /* 
    usage: dbget($mode, $query, $param1, $param2,...); 
    $mode - "dimension" of result: 
    0 - resource 
    1 - scalar 
    2 - row 
    3 - array of rows 
    */ 
    $args = func_get_args(); 
    if (count($args) < 2) { 
    trigger_error("dbget: too few arguments"); 
    return false; 
    } 
    $mode = array_shift($args); 
    $query = array_shift($args); 
    $query = str_replace("%s","'%s'",$query); 

    foreach ($args as $key => $val) { 
    $args[$key] = mysql_real_escape_string($val); 
    } 

    $query = vsprintf($query, $args); 
    if (!$query) return false; 

    $res = mysql_query($query); 
    if (!$res) { 
    trigger_error("dbget: ".mysql_error()." in ".$query); 
    return false; 
    } 

    if ($mode === 0) return $res; 

    if ($mode === 1) { 
    if ($row = mysql_fetch_row($res)) return $row[0]; 
    else return NULL; 
    } 

    $a = array(); 
    if ($mode === 2) { 
    if ($row = mysql_fetch_assoc($res)) return $row; 
    } 
    if ($mode === 3) { 
    while($row = mysql_fetch_assoc($res)) $a[]=$row; 
    } 
    return $a; 
} 
?> 

をしたい場合は、それの呼び出しに、あなたの$のDBHを追加することが、私はそれにはポイントを参照してくださいません。

あなたは$のDBHを渡すと、それはそれはMySQLのか

このような機能を持つにはポイントは絶対にありませんを扱うMSSQLかどうかを確認できますことを、PHPであっ機能です。 データベースハンドラを使用する必要がある場合、データベースハンドラがどのデータベースドライバに属しているかを知っている必要があります。
ああそして、あなたはms SQLでmysql_real_escape_stringを使用しないことを願っています。

+0

セーフ機能がSQLインジェクションを適切に処理するでしょうか? No. safe()関数は、渡された引数にmysql_real_escape_stringを適用するだけで基本的に何もしない限り、このように名前を付けてはいけません。 mysql_real_escape_stringの適用は注入や安全性とはまったく関係がないためです。 - とても良い! –

関連する問題