2013-08-27 37 views
1

我想分割文本表單字段的POST數據。 ()函數PHP在文本字段中檢測換行符

所以我首先檢查POST結果是否有奇怪的字符;

$mails = mysql_real_escape_string($_POST["emails"]); 

然後我運行它,它不工作

$emails = explode("\r\n", $mails); 

我在做什麼錯?它不是\ r \ n?我的sql逃脫位讓我感到困擾嗎?

+1

'\ r'就足以作爲分隔符 – MaveRick

+2

在將SQL上下文實際連接到數據庫查詢(更好,至少更簡單,嘗試準備好的語句/綁定參數)之前,您不會轉義SQL上下文的輸入。線上線下有三種口味,CRLF,CR,LF;所以考慮'preg_split'和'\ R'來捕獲所有。 – mario

回答

2

你也可以在新的生產線轉換爲休息,然後從<br />小號爆炸:

$mails = mysql_real_escape_string(nl2br($_POST["emails"])); 
$emails = explode("<br />", $mails); 
2

所以首先我檢查POST結果是否有奇怪的字符;

$mails = mysql_real_escape_string($_POST["emails"]); 

這裏的一些消息:不,你沒有。你只是做東西不知道你做了什麼。這只是做奇怪的沒有檢查一些奇怪的東西。

然後你需要在使用的行分隔符上爆炸。看起來好像是不"\r\n",下一次嘗試是"\n""\r"以及

$emails = preg_split("/\R/u", $_POST["emails"], -1, PREG_SPLIT_NO_EMPTY); 

(假設你有UTF-8輸入)

+0

刪除了我的和upvoted這一個。 – 2013-08-27 23:08:48

0

嘗試這樣:

function guessLineEndings($aString) { 

    assert(is_string($aString)); 

    if (FALSE !== strpos($aString, "\r\n")) { 
    return 1; 
    } else if (FALSE !== strpos($aString, "\n")) { 
    return 2; 
    } else if (FALSE !== strpos($aString, "\r")) { 
    return 3; 
    } else { 
    return -1; 
    } 

} 

請注意,如果輸入是單行,則無法猜測行結束。

而且不要忘記這一點,如果您運行動態SQL查詢:

切勿使用使用逃避例如mysql_real_escape_string()!始終使用準備好的語句

普萊斯審查OWASPPHP Security Cheat Sheet瞭解這一點:逃逸也不安全!

+0

你正在尋找具有特定的字符序列至少一次,爆炸最有可能不是最好的方式來找出。 – hakre

+0

其實在你的情況下,你可以尋找\ r和\ n,然後如果他們先來一個接一個,或者先來一個:D – hakre

+0

@hakre yes,granted。 – SteAp