【问题标题】:Secure all inputs in PHP form以 PHP 形式保护所有输入
【发布时间】:2015-04-16 15:05:50
【问题描述】:

我的表单有几种类型的输入,包括文本、复选框和单选。我想确保表格是安全的。我使用 Prestashop 函数 isGenericname 和 isCleanHTML 通过确保字段有效来检查文本和注释字段。

Prestashop Validate.php

public static function isGenericName($name)
  {
    return empty($name) || preg_match('/^[^<>={}]*$/u', $name);
  }

public static function isCleanHtml($html, $allow_iframe = false)
  {
    $events = 'onmousedown|onmousemove|onmmouseup|onmouseover|onmouseout|onload|onunload|onfocus|onblur|onchange';

    if (preg_match('/<[\s]*script/ims', $html) || preg_match('/('.$events.')[\s]*=/ims', $html) || preg_match('/.*script\:/ims', $html))
        return false;

    if (!$allow_iframe && preg_match('/<[\s]*(i?frame|form|input|embed|object)/ims', $html))
        return false;

    return true;
  }

这是以 PHP 文件形式调用函数的方式。

if (!Validate::isCleanHtml($message))
    $this->errors[] = Tools::displayError('Invalid message');
elseif (!Validate::isGenericName($fname))
    $this->errors[] = Tools::displayError('Invalid First Name.');

所以我的问题是。可以不对无效的复选框和单选框等输入产生错误消息吗?它们无效的唯一原因是如果有人在发送之前破解了他的代码。还是有更好的方法来剥离和保护输入?

$checkbox = Tools::getValue('checkbox ');
 if (!Validate::isGenericName($checkbox ))
    $validCheckbox = $checkbox;

我有 68 个输入,我想确保它们是安全的。是否有一个很好的 PHP 函数可以去除和阻止任何类型的 SQL 注入? Prestashop 文档指出“getValue() 不能保护您的代码免受黑客攻击(SQL 注入、XSS 缺陷和 CRSF 破坏)。您仍然必须自己保护您的数据。”我想我需要通过 trim()、stripslashes()、htmlspecialchars() 来清理它,但我不知道最有效的方法。

【问题讨论】:

  • 网络软件的#1 规则:永远永远永远信任客户端提交的任何内容。假设 EVERYTHING 是恶意的/敌对的/坏的/无效的,并适当地处理它。 stackoverflow.com/questions/60174/…
  • 您必须根据自己的操作来清理您的输入 - 如果您将其直接放入数据库,htmlspecialchars() 可能不会有很大帮助,但它会如果您将数据发送到屏幕上(无论如何都是 HTML),则可以提供帮助……即使是 HTMLPurifier 之类的库也不一定有助于抵御 SQL 注入攻击。恐怕这里没有灵丹妙药,不要相信任何东西,并以最合适的方式清理一切。
  • 你还必须确保你处理像Preventing SQL Injection这样的事情
  • 68 个字段...我建议这样:php.net/manual/es/function.array-map.php#102130 但是 - 它不是 100% 安全的并且:php.net/manual/en/function.mysql-real-escape-string.php... 你应该知道你期望什么值 - 所以,您可以检查收到的值 == 预期值。 E,克。对于复选框或单选按钮组,您可以制作您期望的值数组('option1','option2',...'optionX') - 如果 $_POST 值不在'expected values'数组中 -> 停止脚本/submission... 这可能效率不高,但很安全。
  • 好的,所以 Prestashop 使用 PDO 来防止 SQL 注入。我可以添加我谈到的所有三个功能吗? $fname= htmlspecialchars(strip_tags(trim(Tools::getValue('fname'))));

标签: php forms security sql-injection prestashop


【解决方案1】:

为了防止一阶 SQL 注入,您可以将 PDO 与 mysql 准备语句一起使用。 当您想将其显示到 html 页面时,请使用

htmlspecialchars(trim($value), ENT_QUOTES, "UTF-8")`

确保您在响应标头中正确设置了适当的字符编码,并使用元标记来指示 HTML 的字符编码。

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

如果您需要将 html 输出更新回数据库。使用

htmlspecialchars_decode(trim($value))

这应该会给你一些保护。

【讨论】:

  • 谢谢。我检查并 Prestashop 使用了 PDO。我最终使用了$fname= htmlspecialchars(strip_tags(trim(Tools::getValue('fname')))); 和其他一些变体。
猜你喜欢
  • 2021-02-26
  • 2016-08-28
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多