PHP网站中的安全策略:SQL注入,XSS攻击和二阶SQL注入

时间:2014-01-25 07:02:59

标签: php security pdo xss sql-injection

我是网络安全的一员,已经研究了两天。据OWSAP称,SQL注入和XSS攻击是互联网上最常见的,每个程序员都必须处理最小的攻击。<​​/ p>

所以无论我理解保护他们的是以下内容(如果我错了,你需要更正或添加):

Use PDO and prepared statements to prevent SQL Injection

PDO和预处理语句足以阻止(一阶)SQL注入,并且我们不需要在驱动程序处理输入数据时对其进行任何转义。

但是这可能会导致您倾向于二阶SQL注入(see this for more),其中' OR '1'='之类的数据可能会在通过PDO并准备好后存储到数据库中这些语句存储原始数据并防止这种情况让我觉得首先要转义字符串,因此

use $pdo->quote($string) before passing it to prepared statement for storage

但是因为我也想要防止XSS攻击,所以我也应该使用htmlentities()(或htmlspecialchars()用于最小的情况)。我应该在输出端执行此操作但我可能更喜欢在输入处使用如果我的输出仅针对HTML

总结一下,我的步骤是

$string ='raw input from user';
$escaped_string=$pdo->quote(htmlentities($string));
$pdo->execute('query to store $escaped_string  into the database');

ouputting

只需回显数据库中存储的字段。

我想知道我的方法是否安全?

3 个答案:

答案 0 :(得分:3)

如果您的代码对二阶攻击持开放态度,那么您并没有正确使用准备好的查询,也没有从根本上理解您在做什么。

在查询中转义数据的目的是消除命令中的数据歧义。在查询中使用参数的关键是从根本上将数据与命令分开。这些都与数据在数据库中的存储方式完全无关。

您执行的每个查询都应使用其中使用的任意数据的参数。如果你不这样做,你可能根本没有任何保护,毫无疑问你的应用程序会有错误。 始终使用参数化查询(并实际使用这些参数)来处理任意数据,即使它来自您自己的数据库。谁在乎它的来源...如果你无法预测数据是什么,你知道它不能直接在查询中使用。

在XSS攻击中......如果要输出HTML页面,可以通过正确转义数据以在HTML上下文中使用来阻止其中的一些攻击。这允许您在保留文本的HTML上下文中使用任意字符串。这会转义HTML的数据,这意味着文本不会被解析为HTML标记。你应该只在输出时进行此转义...不要之前,或者你提前破坏你的数据并使其无法用于其他目的。

答案 1 :(得分:0)

  

但这可能导致您倾向于二阶SQL注入

实际上,这可能不是。没有像“二阶SQL注入”这样的东西。只有SQL注入。要防止它,您必须使用参数化查询。就这么简单。

总结一下,您的步骤将是

$string ='whatever string';
$pdo->prepare('any query that uses ? placeholder for any data');
$pdo->execute([$string]);

虽然默认情况下输出会让你的模板为任何值进行html转义,或者在明确告知时应用任何其他格式 - 例如将其设为原始的html格式文本。

答案 2 :(得分:-1)

如果您无法避免从用户获取原始输入,这是标准过程,如果可能的话,请避免使用来自用户的原始输入。例如:

最好将存储过程用于这些类型的事情。

<?php
  if(isset($_POST['submit'])) {
      if($_GET['sort'] == 'alphad') {
          $sort = 'alphad'; //not = $_GET['sort']
          //Your query
      }
  }
?>