如何保护$ _SERVER ['PHP_SELF']?
我使用下面的代码来控制分页。它使用$_SERVER['PHP_SELF']
,所以我想知道它的安全性如何,或者我需要做些什么才能使$_SERVER['PHP_SELF']
安全?
<?php
if($rows > 10) {
echo '<a id=nex href="'.$_SERVER['PHP_SELF'].'?pg='.($startrow+10).'">
Next</a>';
}
$prev = $startrow - 10;
if ($prev >= 0) {
echo '<a id=pex href="'.$_SERVER['PHP_SELF'].'?pg='.$prev.'">
Previous</a>';
}
?>
工具来防止XSS攻击,你应该使用htmlspecialchars()
或filter_input()
逃脱$_SERVER['PHP_SELF']
。有关更多信息,请参阅this question。
另请注意,如果您启动的href
属性为?
且没有路径,浏览器会将后续查询字符串附加到当前请求,就像相对链接会附加到同一目录一样。
我假设您正在对其他地方的$prev
和$startrow
进行消毒。数学比较应该让他们安全,但是如果他们来自$ _GET,那么在做其他事情之前通过intval()
运行它们是个好主意。
谢谢。这是我在查询的顶部://新脚本开始 if(!isset($ _ GET ['pg'])or!is_numeric($ _ GET ['pg'])){ $ startrow = 0; } else { $ startrow =(int)mysql_real_escape_string($ _ GET ['pg']); } \t 所以使用(int)和转义是正确的? – ariel 2012-04-22 21:55:56
通过inval()传递一个值或将其转换为带有(int)的整数产生相同的结果,是的。 – 2012-04-22 22:16:39
psst:如果您想防止注射,请完全远程操作属性。它默认为一个空字符串,这是一个相对的URI,代表了99.9%的情况下'$ _SERVER ['PHP_SELF']'的含义。 – hakre 2014-12-26 16:11:16
$_SERVER['PHP_SELF']
在某种意义上已经安全的,没有人物可以产生要张贴改变你的HTML语法。唯一的是文件名本身。
通常情况下,您应该使用诸如htmlspecialchars
之类的方法在将输出发布到浏览器之前对输出进行清理。
你应该使用filter_input
:http://php.net/filter_input
$phpSelf = filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_URL);
然后用$phpSelf
代替$_SERVER['PHP_SELF']
。
这比htmlspecialchars
好,但理想的解决方案将可以使用像这样http://htmlpurifier.org/
谢谢。由于我是PHP的新手,我不确定使用filter_input vs htmlspecialchars有什么区别?你能澄清吗? – ariel 2012-04-22 21:54:05
htmlspecialchars仅将一些HTML符号转换为实体,但用户仍可以注入外来字符或UTF-8特殊字符。带有FILTER_SANITIZE_URL的filter_input验证URL链接(您也可以在PHP手册中看到更多的杀毒程序类型),但这也不完整(有复杂的XSS技术可以绕过该技术)。 HTMLPurifier甚至更好,因为它是为了避免XSS并避免其他函数带来的所有问题而编写的。 – alganet 2012-04-22 22:02:12
ok但是htmlspecialchars();仍然可以正常显示用户输入,对吗? – ariel 2012-04-22 22:05:54
“* secure *”有很多含义 - 你的是什么? – 2012-04-22 21:31:31
“安全”的含义$ _SERVER ['PHP_SELF']基本上在地址栏中执行什么。我是PHP的新手,但我被告知$ _SERVER ['PHP_SELF']必须被清理...... – ariel 2012-04-22 21:32:20
在这种情况下没有问题,当您使用$ _SERVER ['PHP_SELF']作为表单操作时。然后,只有当你傻乎乎的接受任何输入而不检查它。 – 2012-04-22 21:34:29