现在我使用以下函数来保护我的字符串:
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
中的字符串的安全,并防止出现诸如HTML page
中的XSS
之类的错误
您只需要PDO!准备好的语句和存储过程。
如果您想从代码中删除javascript
-
看看html净化器。
-
使用正则表达式:
$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
您正在使用两种不同的技术,这两种技术都需要单独的净化方法。
MySQL需要免受SQL注入的保护,最常见的是去掉引号并将非数字类型放在数字字段中。在这种情况下,字符串变量可以通过多种方式进行保护。使用Prepared Statements肯定会有所帮助;诸如mysql_real_escape_string()
或mysqli_real_escape_string()
之类的方法可以净化单个字符串变量,其中is_numeric()
和intval()
的组合可以帮助处理整数。如果你想在每个变量的级别上进行消毒,这完全取决于你的输入;准备好的陈述会在陈述/变量层面上给予你更多的宽容。
另一方面,XSS完全是另一头野兽。htmlentities()
和htmlspecialchars()
等方法在输出数据时会有所帮助,但它也高度依赖于输出数据的上下文。如果您正在输出<span><?=$variable;?></span>
之类的数据,那么这两个函数中的任何一个都会有所帮助。然而,像<a href="<?=$variable;?>">
这样的东西不会。
有关XSS预防的更多详细信息,请从OWASP的XSS(跨站点脚本)预防备忘单开始
我说"保护我的字符串"是指输出?
对于DB输出(包括SELECT查询中使用的变量),请使用*_escape_string函数,或者更好地使用带有PDO对象的准备语句。
对于html输出,您应该使用htmlentities而不是htmlspecialchars
此外,如果从输入运行shell命令,请使用escapeshellarg和escapeshellcmd
防止SQL注入的最佳方法是使用参数化查询。针对XSS,您可以使用一个非常好的库(PHP),称为HTML净化器http://htmlpurifier.org/希望它能帮助
您唯一需要知道的方法是:addslashes
:)