Не уверен, что существует уязвимость PHP sprintf (), но пример кода, как представляется, является ярким примером того, как не нужно ничего делать.
Насколько мне известно, sprintf должен помочь вам заблокировать строку, а не наоборот. Например, это то, что я считаю полезной причиной для использования sprintf ():
$sql = sprintf(
"insert into table (myname, myvalue) values ('%s', '%s')",
mysql_real_escape_string( $_GET['name'] ),
intval( $_GET['value'] )
);
Более полезная причина использовать sprintf - позаимствовать его двоюродного брата, vsprintf и постоянно использовать:
// takes variable number of parameters
function sanitize() {
$args = func_get_args();
$sql = array_shift( $args );
foreach( $args as $k => $v ) $args[$k] = mysql_escape_string( $v );
$safe_sql = vsprintf( $sql, $args );
return( $safe_sql );
}
С его помощью вы можете безопасно изолировать параметры от запросов и предположить, что они будут обработаны:
$t = mysql_query(sanitize(
"insert into mytable (myname, myvalue) values ('%s', '%s')",
$_GET['name'],
$_GET['value']
));