を使用することができ、述べてはるかに重要な問題がある:
でしょう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を使用しないことを願っています。
[mysql_real_escape_string](http://php.net/manual/en/function.mysql-real-escape-string.php)は、リンク識別子である第2のパラメータ(オプション)を受け入れます。開いている接続のハンドルを明示的にこの関数に渡す必要があります。 –