php - 为什么 htmlspecialchars 在表单发布的 'PHP_SELF' 上工作,而不在 'REQUEST_URI' 上工作?

标签 php forms post action htmlspecialchars

我写

http://www.mysite.com/form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

在网址上。现在我按 Enter 键,URL 为:

http://www.mysite.com/form.php/"><script>alert('hacked')</script>

现在我发布表格。使用时$_SERVER['PHP_SELF'] , htmlspecialchars有效,REQUEST_URI不是。为什么?

何时以及为何应使用 action=""action=<?=$_SERVER['PHP_SELF']?>action=<?=$_SERVER['REQUEST_URI']?>

这里是帖子的结果:

$_SERVER['REQUEST_URI']:
  /form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

htmlspecialchars($_SERVER['REQUEST_URI']):
  /form.php/%22%3E%3Cscript%3Ealert(&#039;hacked&#039;)%3C/script%3E

$_SERVER['PHP_SELF']:
  /form.php/"><script>alert('hacked')</script>

htmlspecialchars($_SERVER['REQUEST_URI']):
  /form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;

我想,第二个也应该是最后一个……?

最佳答案

听起来你很困惑htmlspecialcharsurlencode

htmlspecialchars将 HTML 中具有特殊含义的字符替换为 & -逃脱的实体。例如,'变成&#039; 。它不转%22进入&quot; ,但是,因为 %22在 HTML 中没有特殊含义,因此无需修改即可安全显示。

urlencode使用 %URL中具有特殊含义的字符替换为十六进制字符代码。例如,"变成%22 .

如果您希望表单由用于显示表单的同一 URL 进行处理,请始终使用 action=""而不是action=<?=$_SERVER['PHP_SELF']?>action=<?=$_SERVER['REQUEST_URI']?> 。正如您已经发现的,如果您使用 $_SERVER 中的任何一个,则存在严重的跨站点脚本 (XSS) 风险。变量,因为它们包含用户输入,因此不可信。因此,除非您有充分的理由需要以某种方式调整 URL,否则只需使用 action="" .

关于php - 为什么 htmlspecialchars 在表单发布的 'PHP_SELF' 上工作,而不在 'REQUEST_URI' 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21213219/

相关文章:

javascript - ajax post 有大小限制吗?

php - 创建一个 jquery/php 系统来识别一个字符串是否包含来自另一个数据库的用户的用户名

javascript - Python - 填写并提交 HTML 表单

java - Android 应用程序内的 POST 请求返回连接被拒绝,但它可以在浏览器中工作

javascript - 对多种表单使用一个 JavaScript 函数

javascript - 如何在jQuery中获取输入类型复选框和单选框的类型

python - Firefox 和 IE9 中的 Django POST 数据问题,但 Chrome 中没有

php - 水平菜单未出现

php - While 循环与计数查询? (PHP/MySQL)

php - 多合一网络表单