禁用注射

时间:2013-01-04 13:23:28

标签: php html css

  

可能重复:
  How to properly escape html form input default values in php?

我目前正在使用:

if (isset($_GET['b']))
{
  $bb = $_GET['b'];
  echo 'found';
}
else
{
  $bb = 'white';
  echo 'notfound';
}

<body bgcolor="<?php echo $bb; ?>">

允许用户设置页面的颜色,避免注入最安全的方法是什么?

4 个答案:

答案 0 :(得分:4)

假设您期待一种颜色,可以使用十六进制颜色的正则表达式:

^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

和17种标准颜色的列表:浅绿色,黑色,蓝色,紫红色,灰色,灰色,绿色,石灰色,栗色,海军蓝色,橄榄色,紫色,红色,银色,蓝绿色,白色和黄色:

$standards = array(
    'aqua',
    'black',
    'blue',
    'fuchsia',
    'gray',
    'grey',
    'green',
    'lime',
    'maroon',
    'navy',
    'olive',
    'purple',
    'red',
    'silver',
    'teal',
    'white',
    'yellow'
);

if (in_array($bb, $standards) or preg_match('/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/', $bb)) {
    // valid
}

答案 1 :(得分:1)

您始终可以验证$bb仅包含a-zA-Z0-9,这样可以使用单字颜色名称(例如whiteblack,{{ 1}})以及十六进制颜色代码(没有前导grey)。 :)

答案 2 :(得分:0)

使用此选项来转义特殊字符和引号:

<body bgcolor="<?php echo htmlspecialchars($bb, ENT_QUOTES); ?>">    

答案 3 :(得分:0)

这些正则表达式可以验证您的需求。你可以check it here

// match ffffff & fff
if (!preg_match('/^([a-fA-F0-9]{3}|[a-fA-F0-9]{6})$/i', $bb, $matches_bb2)) {
  $color = $bb;
}

// check other color
preg_match('/[\w]+/i', $bb, $matches_bb);

// not a valid string (means no space, no accent, etc ..)
if (isset($matches_bb[0]) && $matches_bb[0] != $bb) {
  $bb = 'white';
}