打破POST或GET变量PHP,安全性

时间:2014-03-28 18:12:42

标签: php security

黑客可以在PHP提交中突破GET或POST方法的最早位置是什么?

例如,

如果我的处理表格的第一行是:

$id= $_GET['id'];
$post_id= $_POST['post_id'];

他们是否已经插入了一些恶意代码,当变量设置为等于未经过滤的GET和POST时会执行?

由于

3 个答案:

答案 0 :(得分:2)

只要你不像eval()那样做一些愚蠢的事情,或者直接将它们放入mysql查询中,那就没事了。

他们大多只是字符串,所以没有直接的危险(如果你的意思是像Windows上的病毒那样)。

这里有一些可能的"恶意"你可以得到的东西:

  • SQL注入攻击
    (打破您的查询做坏事,比如删除表格)
  • PHP注入攻击
    (黑客希望您将其评估,或将其写入.php文件,然后执行该文件)
  • HTML / JavaScript注入攻击
    (如果您在页面上打印它,那么它可以运行错误的JavaScript或打破布局 - 想象</html>在中间你的文章)
  • 伪造的表单字段
    (CSRF等 - 通常避免使用验证码或某些安全令牌)

答案 1 :(得分:2)

不,只要您不使用某种解释语言中的数据来区分代码和数据,处理PHP中的外部输入值就不会带来任何风险。

因为在这种情况下,您可能容易受到injection的攻击。通过解释语言我的意思是任何语言,如HTML(Cross-Site Scripting),SQL(SQL Injection),PHP(Code Injection),shell命令(Command Injection),{{3} }

因此,如果您以任何其他方式使用外部数据,请务必正确处理。

答案 2 :(得分:1)

  1. 最早要突破的地方是,解释传入的GET或POST数据。 在作业eval($_GET['foo']);之后可能是直接$a = $_GET['foo']; eval($a);或间接的。{/ li>
  2. 赋值运算符"="本身不会触发指定内容的执行或解释。你可能认为这是安全的。
  3. 您可能会认为"="为“等于”。不要那样做。 通过使用赋值运算符,左操作数被设置为右侧表达式的值(不是“等于”,而是“设置为”)。
  4. $a = $_GET['a']; $a();这实际上是我能想到的高管最早的地方
  5. 好的,我应该不再是一个挑剔了。

    我的建议是:

    <强>工作流

    1. GET / POST =不受信任的变量内容
    2. 验证,清理
    3. 在准备好的陈述中使用
    4. 存储在db
    5. get form db
    6. 逃逸
    7. 显示
    8. 不信任传入的数据。验证它。

      使用$_dirty['foo'] = $_GET['foo']然后$foo = validate_foo($_dirty['foo']);

      使用PHP的filter_input(),filter_var()或您自己的验证函数。

      您还可以依赖PHP filter_input()函数,而不是编写自己的validate_foo()逻辑。阅读http://www.php.net/manual/en/function.filter-input.php

      $search = filter_input(INPUT_GET, 'search', FILTER_SANITIZE_SPECIAL_CHARS);
      

      示例

      该示例验证传入的$ _GET ['id']。 如果值是整数且在某个范围内,则该值应仅视为有效。

      $range = array('options'=>array('default'=>1, 'min_range'=>0, 'max_range'=>10));
      $id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, $range);
      

      数据库:使用PDO&amp; preparedStatements&amp; bindValue

      http://www.php.net/manual/en/pdostatement.bindvalue.php