纠正这种错误的合适的方法就是确保你从用户接受的输入是你期望得到的。不用为这种错误使用JavaScript验证,创造他们自己形式javascript或是禁用javascript的开发者是很容易处理如此的验证方法的。为确保输入月份和年份是数字,且只有数字,你需要添加PHP代码,如下所示。
$month = $_GET['month'];
$year = $_GET['year'];
if (!preg_match("/^[0-9]{1,2}$/", $month)) die("Bad month, please re-enter.");
if (!preg_match("/^[0-9]{4}$/", $year)) die("Bad year, please re-enter.");
exec("cal $month $year", $result);
print "
";
foreach ($result as $r) { print "$r
"; }print "
";
不用担心用户提供影响你应用程序的输入或是运行输入的服务器,你能安全地使用代码。正则表达式是一个很棒的验证输入的工具。尽管难以掌握它,但在这种情况下是非常有用的。
你应该总是通过拒绝与你期望数据不相符合的数据,来验证你的用户提供的数据。永远都不要使用在你知道期望数据是有害的情况下仍然接受此数据的方法,此方法是安全漏洞的共同来源。有时,恶意的用户能避开此种方法,例如,用空字符来掩盖坏输入的方法。如此的输入将通过检查,但是它仍然具有坏的影响。
当你验证任何输入时,你应当尽可能的严格。如果有一些没必要包含的字符,可能的话,你应该要么去除那些无用的字符,要么完全拒绝输入。
访问控制缺陷
另一个缺陷,不一定限于PHP应用程序,但仍然是重要的,是访问控制的脆弱性类型。当你的应用程序的某些部分的应用是限定于某些用户的时候,这种缺陷就出现了,如,一个允许更改配置设置或显示敏感信息的管理页面。
你应该检查每个你的PHP应用程序页面限制加载的用户的访问权利。如果你仅仅只检查在索引页面的用户证书,那么一个恶意的用户能直接进入一个“更深层”网页的链接,这将跳过证书检查的过程。