【问题标题】:PHP Security - $_POST - InjectionPHP 安全 - $_POST - 注入
【发布时间】:2012-01-09 06:26:03
【问题描述】:

在我的网站上线之前,我对安全性做了一些思考:

这个问题是关于理解 PHP 中的处理,而不是寻求保护表单的解决方案。

考虑一下这个对 xss 完全不安全的准系统脚本和 sql 注入(如果提供)。

<?
if ($_POST['submit']=="1"){

    $input = $_POST['input'];
    echo "echo the input: ".$input."<br/>";
}
?>
<form action="<? $PHP_SELF;?>" method="POST">
<input type="text" name="input" value="<? echo $_POST['input'];?>"/>
<input type="hidden" name="submit" value="1"/>
<input type="submit" value="submit"/>
</form>

我想知道为什么这样的注入不起作用(在字段输入中):

";unset('index.php');

我天真地认为 "; 会结束回声,然后继续执行代码。 实际上我很高兴这不起作用,但我想知道为什么。 在 SQL 类型中,这实际上可以工作 ' OR 1'。

我知道用addslasheshtmlspecialchars 来保护它,但这不是问题所在。我想深入了解 php 如何处理这个问题。

谢谢

【问题讨论】:

  • 除了你自己:小心使用任何 string_munging 函数,例如 addslashes()mysql_real_escape_string()htmlspecialchars(),它们只会在特定位置和特定情况下为您提供所需的保护。见stackoverflow.com/questions/110575/…

标签: php security


【解决方案1】:

$_POST 数组元素的内容是字符串。所以,每当你提交“;unset('index.php');” (顺便说一句,unset 对变量不起作用吗?)您实际上将其作为 string 发送,而不是作为 PHP 可执行代码发送。

除非您使用 eval(),否则您无需担心 php 代码被评估。

另外,不要使用addslashes() 来保护查询,而是使用你的库的专用函数,例如mysql 的mysql_real_escape_string()。或者更好地使用带有准备好的语句和参数化查询的查询绑定。

【讨论】:

  • 嗨。是的,但是针对 xss 我不会使用 htmlspecialchars 吗?或者如果我使用 POST 而不是 GET,那会过时吗?
  • 不,htmlspecialchars() 或 htmlentities() 确实是您针对 XSS 使用的(对于 $_POST 和 $_GET 和 $_COOKIE。实际上,对于所有内容)。我在谈论保护数据库查询,我以为您在谈论 addlashes() 时提到了这一点
  • 我将此标记为答案,因为它解释了更多原因。 thx 2 kolink 也是。
  • 我打算这样做 :P Damien 如果我们只使用 echo 是否仍然危险?或者它只有在我们使用 eval 时才会危险?
【解决方案2】:

如果你把它放在eval() 上它会起作用,但否则它只是一个和其他字符串一样的字符串。

【讨论】:

  • 所以你的意思是如果我在处理 eval() 时写或者如果有人用 eval ";eval(unset('index.php')); 注入。我猜是第一个,这让我很高兴因为我以前从未使用过 eval。
  • @Email 否,如果您发送eval(unset($var)),您仍在发送 string ,即文字字符串。 Eval() 必须 evaluate 提供的字符串以使其成为 php 可执行代码;如果您的代码中没有 eval(),那么您可以安全地应对 那个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 2012-06-12
  • 2012-01-07
相关资源
最近更新 更多