【问题标题】:Securing PHP data from various attacks保护 PHP 数据免受各种攻击
【发布时间】:2017-04-07 20:55:02
【问题描述】:


我是 PHP 安全新手,正在尝试实施 PDO 以外的解决方案。
我在这里阅读了几篇关于 stackoverflow 的文章,并在 Google 上搜索了许多文章。
我尝试编写自己的代码来保护用户输入。
如果我在这里留下任何东西或者我在这里使用了任何不必要的东西,我会请这里的专家看看并指导我。
我也错过了 CSRF 预防。除了随机令牌生成之外还有什么别的吗?这可以使用任何函数来实现吗?

extract($_POST);
$stuid = filter_input(INPUT_GET, 'stud_id', FILTER_SANITIZE_SPECIAL_CHARS); //php filter extension
$stuid = trim($stuid);
$stuid = strip_tags($stuid);
$stuid = iconv('UTF-8', 'UTF-8//IGNORE', $stuid); //remove invalid characters.
$stuid = htmlspecialchars($stuid, ENT_COMPAT, 'UTF-8'); // manual escaping
$stuid = mysql_real_escape_string($stuid);
$stuid = htmlspecialchars($stuid, ENT_COMPAT, 'UTF-8'); //Cross site scripting (XSS)
$email = filter_input(INPUT_POST, $email, FILTER_SANITIZE_EMAIL);
$pass=md5($pass);

提前致谢。

【问题讨论】:

  • “除了 PDO”...我想你的意思是除了 mysqli 之外。你真的不应该推出自己的安全性。会出问题的。
  • 这段代码实际上并没有任何事情,那么你要保护什么?没有单行“安全代码”可以使应用程序安全。您必须了解应用程序正在做什么以及可以利用它的方式。此应用程序不执行任何操作。
  • $pass=md5($pass); 是否对密码进行哈希处理?如果是这样,请改用password_hash() - php.net/manual/en/function.password-hash.php
  • 就我而言,将 POST 提取到变量中并不是一种安全的做法。将它们留在 POST 中,直到您将它们取出并保护它们以供使用。如果您对此感兴趣,我将通过示例提出解决方案。
  • @Gerrit0 我将使用 mysqli 来触发参数化查询。

标签: php security web


【解决方案1】:

如果我的用户已经提交了一条数据供数据库存储,那么我需要确保我已经对其进行了清理并使用了参数化查询:

/* Prepare an insert statement */
$query = "INSERT INTO myTable (DangerousData, MoreDangerousData) VALUES (?, ?)";
$stmt = $mysqli->prepare($query);

$stmt->bind_param($val1, $val2);

// white listing is always the MOST secure since we control the data
switch ($_POST['DangerousData']) {
  case 'Lamb': $val1 = 'Lamb'; break;
  case 'Sheep': $val1 = 'Sheep'; break;
  // so if they send something not allowed, we have a default
  default: $val1 = 'WolfinsheepsClothing';
}

// otherwise, the parametization of the statement will
// clean the data properly and prevent any SQL injection
$val2 = $_POST['MoreDangerousData'];

/* Execute the statement */
$stmt->execute();

就电子邮件而言,您需要研究互联网上的示例,了解如何根据您希望使用的目的正确清理来自用户的输入 - 大多数人使用正则表达式来验证电子邮件的安全性和有效性电子邮件。

Stackoverflow can help you validate an email.

Stackoverflow can help sanitize user input, too.

【讨论】:

  • 让我重申,作为编码实践,最不安全的事情是使用 extract 将不干净的变量转储到作用域中。如果值还在 POST 中,则认为是不安全的;时期。一旦“取出”,就应该专门针对预期目的进行清洁。清理发送电子邮件不同于清理生成 HTML 不同于清理存储在数据库中。没有“一刀切”,就像您保护信用卡的方式与保护现金的方式不同(我可以自拍我的本杰明富兰克林,但不能自拍我的 whatsinyourwallet 签证,嗯?)
猜你喜欢
  • 2019-12-31
  • 2015-12-08
  • 1970-01-01
  • 2010-11-04
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多