-3

可能重复:
如何正确转义 php 中的 html 表单输入默认值?

我目前正在使用:

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

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

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

4

4 回答 4

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
}
于 2013-01-04T13:26:29.280 回答
1

您始终可以验证$bb仅由 组成a-zA-Z0-9,这将使其与单字颜色名称(例如white, black, grey)以及十六进制颜色代码(没有前导#)一起使用。:)

于 2013-01-04T13:27:36.310 回答
0

使用它来转义特殊字符和引号:

<body bgcolor="<?php echo htmlspecialchars($bb, ENT_QUOTES); ?>">    
于 2013-01-04T13:27:45.937 回答
0

这些正则表达式可以验证您需要什么。你可以在这里查看

// 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';
}
于 2013-01-04T13:30:25.213 回答