【问题标题】:PHP Security Advice on $_GET (combining clean URLs with query string)关于 $_GET 的 PHP 安全建议(将干净的 URL 与查询字符串结合起来)
【发布时间】:2011-10-27 04:10:59
【问题描述】:

我正在使用这样的“干净”网址:

http://localhost/controller/action/param

我使用 my_get(1)、my_get(2) 等自定义函数访问参数...

但有时我认为我需要将它们与查询字符串结合起来。 例如:如果我需要包含带有多个斜杠的路径的参数值,例如:

http://localhost/controller/action/param?mypath=foo/bar/qux.jpg

我这样做是因为如果使用干净的 URL 来实现会有点困难。

现在我的问题是,在结合干净的 URL 和查询字符串时,我只打算允许这个字符类:

[.&=a-z0-9\/_-]

我想知道它是否存在任何安全问题?我应该禁止某些字符吗?

【问题讨论】:

  • 我认为您无需担心斜线和字符,而更多地担心您对该路径的操作。如果我将路径变量更改为 ../../../etc/passwd 会怎样?查找路径清理
  • 您打算如何处理查询参数的值?字符串本身不会造成安全风险。
  • 上例中的@Inerdia,mypath的值会被unlink()删除;
  • @Ashley 正在阅读相关内容,使用 $f = realpath($_GET['file']); unlink($f); 而不是普通的 unlink($_GET['file']); 是否安全?您将如何检查上述示例中的“黑客攻击”?
  • @IMB:realpath 是一个好的开始,但您还必须验证真实路径是否安全——您存储数据文件的位置的子目录。

标签: php


【解决方案1】:

不介意字符串格式,但请验证传递的路径...在您所说的示例中:“在上面的示例中,mypath 的值将被 unlink(); 删除”,好吧,如果你不' t 在最坏的情况下验证它,攻击者可以删除服务器文件系统上的任何文件... ;)

因此,不必费心使用正则表达式验证字符串,而是验证字符串的内容并使其对您的环境安全... :)

【讨论】:

  • 这样就够了吗? if (strpos($_GET['mypath'], 'foo/bar') === false) die('invalid');
  • 取决于你想要做什么,但这是一个开始;)
  • 您提到我不应该费心使用正则表达式进行验证,但是如果我坚持使用干净的 URL 并且不使用任何查询字符串,那么使用正则表达式进行验证将是一个好主意,还是它仍然没用?
  • 例如使用干净的 URL 添加,我只允许这样:[a-z0-9\/_-]
猜你喜欢
  • 1970-01-01
  • 2012-08-26
  • 2011-05-25
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多