【问题标题】:Prevention of SQL Injection Attacks [duplicate]预防 SQL 注入攻击 [重复]
【发布时间】:2013-04-13 06:38:18
【问题描述】:

大家好,我正在试验并开始创建一个将实施论坛的网站。我已经开始研究可能影响网站的安全问题。跨站脚本和sql注入攻击等领域。

从研究中剥离所有 html 标签将阻止 XSS。将这连同剥离 SQL 特殊字符是否足以防止 sql 注入攻击?

<?php
require "dbconn.php";

$mnam = strip_tags($_GET['blogentername']);
$mcom = strip_tags($_GET['blogmessage']);
$approve = 'N';
$dte = gmdate("d-M-Y H:i:s");

$mnam = mysql_real_escape_string($user);
$mcom = mysql_real_escape_string($mcom);

$query = "INSERT INTO blogentry VALUES  ('".$mnam."','".$dte."','".$mcom."','".$approve."','','')";

$results = mysql_query($query)
           or die(mysql_error());

header('Location:messages.php?messagesent=1');

?>

感谢大家的时间安迪

【问题讨论】:

  • 您的代码中没有删除 SQL 特殊字符。我想说没有像“SQL 特殊字符”这样的东西
  • 我推荐阅读 OWASP
  • 防止XSS的方法是在创建HTML时正确编码文本。
  • 看右边.... 1314!!!!! (问题中的投票)
  • 我一直在看那张幻灯片,它回答了这个问题。我的道歉

标签: php html sql mysqli


【解决方案1】:

对于给出的代码 - 是的,它非常安全且难以穿透。

但是,您防御 SQL 注入的想法通常是非常错误的。

您的代码中没有“删除 SQL 特殊字符”。而且这样的剥离根本没有意义。
说到 SQL 字符串,如果正确格式化,它们是相当安全的。但对于所有其他 SQL 文字,你称之为“剥离”的东西实际上不会剥离任何东西。

【讨论】:

  • 感谢您的建议
【解决方案2】:

你不应该剥离标签。将它们原始保存在数据库中,然后在将它们输出到浏览器时使用htmlspecialchars

【讨论】:

  • 感谢您的建议
  • 我不认为这是一个非常合理的建议。可能很容易忘记用户可以控制从数据库中检索的信息,而很容易意识到用户在将数据插入数据库时​​可以控制数据。为什么不两者都做?
【解决方案3】:

作为最佳实践,切勿使用字符串连接来构建 SQL 命令。

使用参数化查询。它们本质上更安全,并且可以通过数据库引擎进行优化,以便在多次执行相同类型的语句时提供更好的性能。

更多信息和例子在这里:How can I prevent SQL injection in PHP?

【讨论】:

  • 不幸的是,我们无法避免串联。所以,最好知道规则
  • 在一个典型的 Web 应用程序中多次执行相同类型的语句是糟糕设计的味道
  • 通常在循环数据集时执行 INSERT 或 UPDATE 时完成。 SQL 语句准备一次,然后每次通过循环将值简单地传递给它并快速执行,因为它不必重新评估整个 SQL 语句。请参阅stackoverflow.com/questions/1318023/…stackoverflow.com/questions/1851834/… 了解更多信息。
  • 您所说的这种虚构的“评估”好像是一件大事,但实际上只需要很少的时间,以至于您几乎不会注意到它。特别是对于像插入或更新这样的简单查询。尤其是与 HDD 写入操作相比。您链接到的第一个答案是使用 SELECT 进行测试,而第二个答案根本没有证据。而且,我想,您的意见不是基于您自己的经验,而是基于您阅读的一些文章?
  • 不,我没有亲自对它进行基准测试。这就是为什么我传递了 cmets,其中引用了那些做过的人:“我已经看到当你使用参数化查询时 sqlite 变得快 3 倍,当你在一些具有大量并发的极端情况下使用参数化查询时,oracle 可以变得快 10 倍。 "和“在某些情况下,当需要从 localhost 检索大量数据时,我看到了 5 倍以上的性能提升”。像所有优化一样,首先找出瓶颈所在。这可能不是程序中最糟糕的事情,但需要检查。
猜你喜欢
  • 2012-02-28
  • 2013-02-14
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多