0

现在我正在使用以下函数来保护我的字符串:

  function secure($data)
  {
    $data = trim($data);
    $data = htmlspecialchars($data);
    $data = str_replace("'", '"', $data);
    $search = array(chr(0xC2).chr(0xA0),chr(0xC2).chr(0x90),
                              chr(0xC2).chr(0x9D),chr(0xC2).chr(0x81),
                              chr(0xC2).chr(0x8D),chr(0xC2).chr(0x8F),
                              chr(0xC2).chr(0xAD),chr(0xAD));
    $data = str_replace($search, "", $data);
    return $data;
  }

这个函数是否足以保护字符串?

您将使用哪些方法来保护要插入的字符串MySQL并防止诸如XSSin之类的错误HTML page

4

5 回答 5

3

您只需要 PDO!准备好的语句和存储过程

如果您想从代码中删除 javascript

  • 看看htmlpurifier

  • 使用正则表达式:$html = preg_replace('#<script(.*?)>(.*?)</script>#is', '', $html);

  • 或使用DOMDocument

    $doc = new DOMDocument();
    $doc->loadHTML($html); // load the HTML string we want to strip
    
    $script_tags = $doc->getElementsByTagName('script'); // get all the script tags
    
    $length = $script_tags->length;
    
    for ($i = 0; $i < $length; $i++) {
      $script_tags->item(0)->parentNode->removeChild($script_tags->item(0)); // for each tag, remove it from the DOM
    
    }
    
    $no_script_html_string = $doc->saveHTML(); // get the HTML string back
    
于 2012-07-27T14:07:34.237 回答
2

您正在使用两种不同的技术,它们都需要单独的消毒方法。

MySQL 需要保护免受 SQL 注入,最常见的是打破引号并将非数字类型放在数字字段中。在这种情况下,字符串变量可以通过许多东西来保护。使用准备好的语句肯定会有所帮助;方法如mysql_real_escape_string(), 或mysqli_real_escape_string()可以清理单个字符串变量,其中is_numeric()和的组合intval()可以帮助处理整数。如果您想在每个变量级别上进行清理,这一切都取决于您的输入;准备好的声明将通过在声明/变量级别上为您提供更多的宽大处理。

另一方面,XSS 完全是另一种野兽。诸如htmlentities()和之类的方法htmlspecialchars()可以在输出数据时有所帮助,但它也高度依赖于输出数据的上下文。如果您要输出诸如 之类的数据<span><?=$variable;?></span>,这些函数中的任何一个都会有所帮助。但是,类似的东西<a href="<?=$variable;?>">不会。

有关 XSS 预防的更多详细信息,请从 OWASP 的XSS(跨站点脚本)预防备忘单开始

于 2012-07-27T14:12:57.513 回答
1

防止 SQL 注入的最佳方法是使用参数化查询。针对 XSS,您可以使用一个非常好的库 (PHP),称为 HTML Purifier http://htmlpurifier.org/ 希望对您有所帮助

于 2012-07-27T14:12:03.957 回答
1

通过说“保护我的字符串”,我假设您的意思是输出?

对于 DB 输出(包括 SELECT 查询中使用的变量),使用 *_escape_string 函数,甚至更好地使用带有 PDO 对象的预处理语句。

对于 html 输出,您应该使用htmlentities而不是htmlspecialchars

此外,如果从输入运行 shell 命令,请使用escapeshellargescapeshellcmd

于 2012-07-27T14:14:12.587 回答
-3

您必须知道的唯一方法是: addslashes:)

于 2012-07-27T14:06:26.843 回答