2012-04-22 169 views
4

我使用下面的代码来控制分页。它使用$_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>'; 
    } 

?> 
+0

“* secure *”有很多含义 - 你的是什么? – 2012-04-22 21:31:31

+0

“安全”的含义$ _SERVER ['PHP_SELF']基本上在地址栏中执行什么。我是PHP的新手,但我被告知$ _SERVER ['PHP_SELF']必须被清理...... – ariel 2012-04-22 21:32:20

+0

在这种情况下没有问题,当您使用$ _SERVER ['PHP_SELF']作为表单操作时。然后,只有当你傻乎乎的接受任何输入而不检查它。 – 2012-04-22 21:34:29

回答

7

工具来防止XSS攻击,你应该使用htmlspecialchars()filter_input()逃脱$_SERVER['PHP_SELF']。有关更多信息,请参阅this question

另请注意,如果您启动的href属性为?且没有路径,浏览器会将后续查询字符串附加到当前请求,就像相对链接会附加到同一目录一样。

我假设您正在对其他地方的$prev$startrow进行消毒。数学比较应该让他们安全,但是如果他们来自$ _GET,那么在做其他事情之前通过intval()运行它们是个好主意。

+0

谢谢。这是我在查询的顶部://新脚本开始 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

+0

通过inval()传递一个值或将其转换为带有(int)的整数产生相同的结果,是的。 – 2012-04-22 22:16:39

+0

psst:如果您想防止注射,请完全远程操作属性。它默认为一个空字符串,这是一个相对的URI,代表了99.9%的情况下'$ _SERVER ['PHP_SELF']'的含义。 – hakre 2014-12-26 16:11:16

0

$_SERVER['PHP_SELF']在某种意义上已经安全的,没有人物可以产生要张贴改变你的HTML语法。唯一的是文件名本身。

通常情况下,您应该使用诸如htmlspecialchars之类的方法在将输出发布到浏览器之前对输出进行清理。

8

你应该使用filter_inputhttp://php.net/filter_input

$phpSelf = filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_URL); 

然后用$phpSelf代替$_SERVER['PHP_SELF']

这比htmlspecialchars好,但理想的解决方案将可以使用像这样http://htmlpurifier.org/

+0

谢谢。由于我是PHP的新手,我不确定使用filter_input vs htmlspecialchars有什么区别?你能澄清吗? – ariel 2012-04-22 21:54:05

+0

htmlspecialchars仅将一些HTML符号转换为实体,但用户仍可以注入外来字符或UTF-8特殊字符。带有FILTER_SANITIZE_URL的filter_input验证URL链接(您也可以在PHP手册中看到更多的杀毒程序类型),但这也不完整(有复杂的XSS技术可以绕过该技术)。 HTMLPurifier甚至更好,因为它是为了避免XSS并避免其他函数带来的所有问题而编写的。 – alganet 2012-04-22 22:02:12

+0

ok但是htmlspecialchars();仍然可以正常显示用户输入,对吗? – ariel 2012-04-22 22:05:54