亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在PHP中,當向數據庫提交字符串時,我應該使用htmlSpecialchars()處理非法字符

在PHP中,當向數據庫提交字符串時,我應該使用htmlSpecialchars()處理非法字符

MYYA 2019-06-20 15:45:15
在PHP中,當向數據庫提交字符串時,我應該使用htmlSpecialchars()處理非法字符還是使用正則表達式?我正在處理一個表單,該表單允許用戶在要提交到數據庫的字符串中使用非法/特殊字符。我想轉義/否定字符串中的這些字符,并且一直在使用htmlSpecialchars()..然而,是否有更好/更快的方法?
查看完整描述

3 回答

?
MMMHUHU

TA貢獻1834條經驗 獲得超8個贊

如果將此數據提交給數據庫,請查看數據庫的轉義函數。

也就是說,對于MySQL來說MySQL真實轉義字符串.

這些轉義函數處理任何可能是惡意的字符,您仍將以相同的方式獲取數據。

您還可以使用準備好的語句來處理數據:

$dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (?)');$dbPreparedStatement->execute(array($yourHtmlData));

或者再自我解釋一下:

$dbPreparedStatement = $db->prepare('INSERT INTO table (htmlcontent) VALUES (:htmlcontent)');$dbPreparedStatement->
execute(array(':htmlcontent' => $yourHtmlData));

如果要保存不同類型的數據,請使用bindParam若要定義每種類型,即可以通過以下方法定義整數:$db->bindParam(':userId', $userId, PDO::PARAM_INT);..例子:

$dbPreparedStatement = $db->prepare('INSERT INTO table (postId, htmlcontent) VALUES (:postid, :htmlcontent)');
$dbPreparedStatement->bindParam(':postid', $userId, PDO::PARAM_INT);$dbPreparedStatement->bindParam(':htmlcontent', 
$yourHtmlData, PDO::PARAM_STR);$dbPreparedStatement->execute();

哪里$db是PHP數據對象(PDO)。如果你不使用它,你可以在PHP數據對象.


查看完整回答
反對 回復 2019-06-20
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

數據庫中沒有“非法”字符。不能存儲某些字符的數據庫是一派胡言。有一些服務字符,如引號,用于分隔字符串。這些角色應該只是轉義,而不是被刪除。

要向數據庫發送查詢,您有兩個選項:

  1. 構建一個通常的查詢方式,使其看起來與SQL控制臺中運行的SQL查詢完全一樣。
    要做到這一點,一個人應該明白一整套規則,而不僅僅是“使用MySQL_REAL_EXECH_String”。
    規則,如:

    • 字符串應該用引號和轉義來括起來。這是轉義的唯一含義:它只是逃避分隔符!(以及其他一些字符-字符串終止字符和轉義字符本身)。沒有周圍的引號,MySQL_REAL_EXECH_String就沒用了。
    • 數字應該顯式地轉換為它的類型。雖然數據數字可以像字符串一樣受到威脅,但也有一些數字,比如限制子句參數,它們不能轉義,只能進行強制轉換。
  2. 發送查詢和數據分別.
    這是最可取的方式,因為它可以縮短為只是“使用綁定”。所有字符串、數字和限制參數都可以綁定-完全不用擔心。
    使用此方法,您的查詢將占位符按原樣發送到數據庫,綁定數據以單獨的數據包發送,因此不會發生干擾。就像電碼數據分離。將程序(查詢本身)與數據分開發送。

但!

上面提到的所有內容都只涉及查詢的數據部分。
但有時我們必須使查詢更加動態,添加運算符或標識符。
在這種情況下,每個動態參數都應該在腳本中進行硬編碼,并從該集合中選擇。
例如,要執行動態排序:

$orders  = array("name","price","qty"); //field names$key     = array_search($_GET['sort'],$orders)); 
// see if we have such a name$orderby = $orders[$key];
 //if not, first one will be set automatically. smart enuf :)$query   = "SELECT * FROM `table` ORDER BY $orderby"; 
 //value is safe

或動態搜索:

$w     = array();$where = '';if (!empty($_GET['rooms']))     
$w[]="rooms='".mesc($_GET['rooms'])."'";if (!empty($_GET['space']))     
$w[]="space='".mesc($_GET['space'])."'";if (!empty($_GET['max_price'])) 
$w[]="price < '".mesc($_GET['max_price'])."'";if (count($w)) $where="WHERE ".implode(' AND ',$w);$query="select * from table $where";

在本例中,我們只向查詢中添加由用戶輸入的數據,而不是字段名,這些數據都是在腳本中硬編碼的。對于綁定,算法將非常相似。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 947 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號