2014-03-28 42 views
0

黑客在PHP提交中可以突破GET或POST方法的最早地点是什么?突破POST或GET变量PHP,安全

例如,

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

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

可他们已经插入一些恶意代码,当变量设定为等于未过滤,将执行GET和POST ?

感谢

+5

不会。当您尝试*使用*这些变量并且它们包含恶意输入时,就会成为问题。 –

+0

约翰说什么。无论何时,当您收到用户的输入时,您都应该验证它是否符合您期望的输入的确切格式,对输入进行清理,并拒绝任何不符合规范的内容。也就是说,您仍然应该使用参数化查询之类的东西来防止SQL注入等常见事情。 – Sammitch

+0

所以这个序列是“完全”安全的: 获取变量未过滤 - >准备语句存储在db->获取表单数据库和显示在HTML使用htmlspecialchars()或htmlentities() – Harvard

回答

0
  1. 最早地方突围 - (CSRF等使用验证码或一些安全令牌通常避免),是,当进入的GET或POST数据是在terpreted。 可能是直接的,eval($_GET['foo']);,或间接,在作业后$a = $_GET['foo']; eval($a);
  2. 赋值运算符"="本身不会触发对分配内容的执行或解释。你可能会认为它是安全的。
  3. 您可能会认为"="为“等于”。不要这样做。 通过使用赋值运算符,左操作数被设置为右边表达式的值(不是“等于”,而是“被设置为”)。
  4. $a = $_GET['a']; $a();其实这是我能想到的

确定最早的地方一个exec的,我不应该再是一个都舍不得亏的。

我的建议是:

工作流程

  1. GET/POST =不可信变量的内容
  2. 验证,消毒在准备好的声明
  3. 店分贝
  4. 使用
  5. 获取订单DB
  6. 逃生
  7. 显示

不要相信进来的数据。验证它。

使用$_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 &的PreparedStatement & bindValue

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

2

只要你不要做一些愚蠢像eval()他们或直接把那些到MySQL查询,它的罚款。

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

下面是一些可能的 “恶意” 的东西,你可以得到:

  • SQL注入攻击
    (破坏你的查询做坏事,就像删除表)
  • PHP注入攻击
    (黑客希望你会评估它,或将其写入.php文件,并稍后执行)
  • HTML/JavaScript注入攻击
    (如果你打印一个页面上,所以它可以运行不好的JavaScript或破坏布局 - 在你的文章中间想象</html>
  • 锻造表单字段
+1

“如果eval()是答案,那么你肯定会问 错误的问题。” - Rasmus Lerdorf,BDFL,PHP – Sammitch

+0

eval()有一个常见用例:在线PHP编辑器,用于实时编码。这就是沙盒的原因。 –

2

不,在PHP中处理外部输入值不,只要你不使用数据造成任何风险在某些解释性语言中,区分代码和数据。

因为在这种情况下,您可能会受到injection的影响。和解释语言,我的意思是像HTML(Cross-Site Scripting),SQL(SQL Injection),PHP(Code Injection)任何语言,shell命令(Command Injectionetc.

因此,如果您在其他任何方式使用外部数据,确保处理它正确。

+0

+1提供CWE链接 –