【问题标题】:PHP and SQL InjectionPHP 和 SQL 注入
【发布时间】:2013-05-16 22:33:23
【问题描述】:

我有这个 PHP,我只是想确保它不会受到 SQL 注入和安全漏洞的影响:

<?php
require_once "./source/includes/data.php";
header('Content-type: application/json');
$request = mysql_real_escape_string($_REQUEST['email_address']);

$query = mysql_query("SELECT * FROM mmh_user_info WHERE email_address ='$request'");
$result = mysql_num_rows($query);
if ($result == 0){
$valid = 'true';}
else{
$valid = 'false';
}
echo $valid;
?> 

我还是个 php 新手,任何改进或编辑将不胜感激!

【问题讨论】:

  • 注射相当安全,但是如果您正在编写新代码,为什么不使用PDOmysqli 准备好的语句呢?尽可能安全..
  • $email_address 在您的 WHERE 子句中可能应该是 $request。除此之外,安全。
  • 您能建议对此代码进行修改吗?或者建议一个教程来解释如何在 mysqli 准备好的语句中做到这一点?谢谢你的建议!
  • @Shi 感谢您的建议,已编辑:)
  • 我们需要了解您如何输出数据以及如何插入数据,因为在某些情况下,could 仍然容易受到 XSS 攻击。

标签: php sql security code-injection


【解决方案1】:

我建议你使用正在成为 PHP5 标准的 PDO:

$sth = $dbh->prepare("SELECT * FROM mmh_user_info WHERE email_address = ?");
$sth->execute(array($_REQUEST['email_address']));
$red = $sth->fetchAll();

【讨论】:

  • 此处需要额外的isset 检查
  • execute() @zerkms 里面不应该有一个array()
  • @php NoOb:也是,但这不是我的答案:-)
  • mysqli 扩展也支持预处理语句。
  • 我将它与 jQuery validate 'remote' 一起使用。我需要结果是真还是假,这可以用 PDO 完成吗?
【解决方案2】:

对于用户Pascal MARTINthis great answer 中指出的点,我将使用 $_POST 而不是 $_REQUEST:

$_REQUEST默认包含$_GET$_POST$_COOKIE的内容。

但这只是一个默认值,取决于variables_order;并且不确定是否要使用 cookie。

如果我必须选择,我可能不会使用$_REQUEST,我会选择$_GET$_POST -- 取决于我的应用程序应该做什么 (即一个或另一个,但不是两者兼而有之):一般来说:

  • 当有人您的应用程序请求数据时,您应该使用$_GET
  • 当有人推送(插入或更新;或删除)数据您的应用程序时,您应该使用$_POST

无论哪种方式,性能不会有太大差异:与脚本的其余部分相比,差异可以忽略不计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2018-03-23
    • 2021-06-06
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多