PHPマジック引用符によるセキュリティ問題の分析

1444 ワード

PHPがマジック引用符を抽出することによって生成される「」文字は、次のようなセキュリティ上の問題をもたらします.

// foo.php?xigr='ryat
function daddslashes($string, $force = 0) {
!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
}
return $string;
}
...
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
foreach($$_request as $_key => $_value) {
$_key{0} != '_' && $$_key = daddslashes($_value);
}
}
echo $xigr['hi'];
// echo \

上のコードは、daddslashes()セキュリティ処理後の配列変数$xigr['hi']を得ることを期待していたが、変数$xigrに対して厳密なタイプ規定はなく、文字列変数$xigr='ryatを提出すると、上の処理で'ryatになり、最後の$xigr['hi']に出力され、この変数がSQL文に導入されると、深刻なセキュリティ問題を引き起こす.次のコードクリップを見てみましょう.

...
if($xigr) {
foreach($xigr as $k => $v) {
$uids[] = $v['uid'];
}
$query = $db->query("SELECT uid FROM users WHERE uid IN ('".implode("','", $uids)."')");


上記の考え方を利用してfooを提出する.php?xigr[]='&xigr[][uid]=evilcodeのような構造形式はGPCや類似の安全処理を容易に突破し、SQL射出ホールを形成することができる!これに対して十分な重視を与えるべきです!