如何防止注入(html,php)

How can I prevent injection(html,php)?

本文关键字:php html 何防止 注入      更新时间:2023-09-26

可能重复:
在PHP站点中避免xss攻击的最佳实践是什么

我有一个<textarea>和一个<input>供我的网站评论。显然,我在接口页中echo它们,并将它们插入到我的数据库中。

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

什么是简单的方法?

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

手动搜索这些字符是最好的方法吗(PHP和Javascript)?

您试图实现的是防止某种形式的XSS(跨站点脚本攻击)攻击。你正试图阻止持久的变种:

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

有许多选择可以防止它们。OWASP有一个简洁的解释。。仔细查看并找出答案。但大多数情况下,这是一个非常大的问题,由个人单独处理。

最好的方法是使用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);

例如

$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注入攻击的问题,请参阅以下问题:如何在PHP中防止SQL注入?这个答案是

报价:

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.

我在使用时从未遇到过问题

$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'])))));

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

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