我怎样才能防止注射(html,php)?

时间:2012-02-01 17:06:05

标签: php javascript html regex xss

  

可能重复:
  What are the best practices for avoiding xss attacks in a PHP site

我有一个<textarea>和一个<input>来评论我的网站。显然,我echo他们在一个界面页面并插入我的数据库。

我想知道当一个人注射(例如)一个<img>来破坏页面或向损坏数据库发送查询时我该怎么办?

什么是简单方法?

我尝试使用< > ' " drop进行搜索,但我使用的是\"而不是",但它不起作用,而且在PHP中,我遇到了错误。

手动搜索这些字符的最佳方式(PHP和Javascript)?

3 个答案:

答案 0 :(得分:1)

你想要达到的目的是防止XSS (Cross site scripting attacks)攻击形式。你试图阻止持久的变化:

  

持久(或存储)的XSS漏洞更具破坏性   跨站点脚本缺陷的变体:它发生在数据时   由攻击者提供的是由服务器保存,然后永久保存   显示在“正常”页面上,返回给其他用户   定期浏览,没有正确的HTML转义。一个经典的例子   这是用户可以发布的在线留言板   HTML格式的消息供其他用户阅读。

有很多选择可以阻止它们。 OWASP has a neat explanation.。仔细检查并找出答案。但对于个人而言,这主要是一个非常大的问题。

最好的方法是使用简单易用的HTMLPurifier。它可能有点慢。但额外的处理是值得的。为了给你一个简单的例子,这里有一个基本的代码:

<?php
    require_once '/path/to/htmlpurifier/library/HTMLPurifier.auto.php';

    $config = HTMLPurifier_Config::createDefault();
    $purifier = new HTMLPurifier($config);
    $clean_html = $purifier->purify($dirty_html);
?>

PS:HTMLPurifier具有“白名单”选项。使用它有利于您。

  

例如,您可以微调允许的元素和属性,   将相对URL转换为绝对URL,甚至自动图表输入   文本!它们分别是%HTML.Allowed,%URI.MakeAbsolute和   %URI.Base和%AutoFormat.AutoParagraph。 %Namespace.Directive   命名约定转换为:

$config->set('Namespace.Directive', $value);
     

E.g。

$config->set('HTML.Allowed', 'p,b,a[href],i');
$config->set('URI.Base', 'http://www.example.com');
$config->set('URI.MakeAbsolute', true);
$config->set('AutoFormat.AutoParagraph', true);

编辑:

要回答有关停止格式错误的SQL注入攻击的问题,请参阅以下问题:How can I prevent SQL injection in PHP?this answer

引用:

Use prepared statements and parameterized queries. These are SQL statements that sent to and parsed by the database server separately from any parameters.

If you use PDO you can work with prepared statements like this:

$preparedStatement = $db->prepare('SELECT * FROM employees WHERE name = :name');

$preparedStatement->execute(array(':name' => $name));

$rows = $preparedStatement->fetchAll();
where $db is a PDO object, see the PDO documentation. The mysqli class also provides parameterized queries.

答案 1 :(得分:-1)

我从来没有遇到过这样的问题:

$login = preg_replace(sql_regcase("/(from|select|insert|delete|where|drop table|show tables|update|declare|exec|set|cast|$|#|%|&|'|\"|`|;|\*|--|\\\\)/"),"",trim(addslashes(htmlspecialchars(strip_tags($_POST['comment'])))));

答案 2 :(得分:-2)

使用addslashes($your_variable)功能。这将在特殊字符之前添加反斜杠,并使用stripslashes($db_result)消除不需要的斜杠。 http://php.net/manual/en/function.addslashes.php

您也可以使用 mysql_real_escape_string() http://php.net/manual/en/function.mysql-real-escape-string.php