2012-07-27 45 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