2012-07-27 46 views
0

现在,我使用下面的函数来保护我的琴弦插入MySQL表和在HTML页面:安全弦乐使用PHP

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 pageXSS

回答

1

开始通过说“安全我的琴弦”我假设你的意思是输出?

对于数据库输出(其中包括SELECT查询中使用的变量),使用* _escape_string函数,或者更好地将prepared statements用于PDO对象。

对于HTML输出,你应该使用htmlentities,而不是htmlspecialchars

此外,如果从投入使用escapeshellargescapeshellcmd

+0

不幸的是htmlentities返回奇怪的符号,而不是俄罗斯字符 – John 2012-07-27 14:24:59

+0

您需要指定编码 – Ing 2012-07-27 14:26:36

+0

添加UTF-8编码,现在它的工作,谢谢 – John 2012-07-27 14:34:37

-3

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

+0

这是__not__真正运行shell命令。 “addslashes()”被称为是不安全的;-)。 – thedom 2012-07-27 14:07:09

+0

好的,请证明我为什么:) – PoulsQ 2012-07-27 14:08:23

+0

-1错误信息 – Ing 2012-07-27 14:08:39

3

所有你需要的是PDO! Prepared statements and stored procedures

如果你想从你的代码中删除的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 
    
+0

它也将安全的字符串添加到HTML页面没有< >或JavaScript代码? – John 2012-07-27 14:09:42

+0

我更新了我的答案 – Besnik 2012-07-27 14:29:27

+0

感谢您的回答 – John 2012-07-27 14:33:37

1

最好的办法,以确保对SQL注入是使用参数化查询。 和反对XSS你可以使用一个很好的库(PHP)称为HTML过滤http://htmlpurifier.org/ 希望它有助于

2

你有两种不同的技术,都需要单独的消毒方法玩。

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 (Cross Site Scripting) Prevention Cheat Sheet