PHP sql处理特殊字符

时间:2018-04-14 12:14:56

标签: php sql insert

$sql = "INSERT INTO golf (datum, odkud, odjezd ) VALUES ('$datum', '$odkud', '$odjezd')";
if(!mysqli_query($connection,$sql)) {
echo '<p class="error">Záznam nebyl vložen</p>';
} else {
header ("location :/golf");
}

你好,我正在研究我的论文到学校。我有这个代码,我的主管一直告诉我“对待特殊字符”。我怎么做?他只看到我给你看的代码。

2 个答案:

答案 0 :(得分:1)

用户输入必须在插入之前为sanitized,否则您将打开通往服务器的门。
您还需要validate输入。我通常做的是创建一系列正则表达式来单独验证每个字段,或使用其中一个可用的php validate filters
请记住,您可以 - 并且应该 - 执行client side validation,这对减少服务器负载很有帮助,但是作为安全措施有0值,因为它很容易伪造。 server side validation是最重要的,因为它是最后一道防线
不要轻易接受用户输入,大量服务器因用户输入消毒不良或不存在而被黑客入侵。

要直接回答您的问题,mysqli_real_escape_string()转义特殊字符的朋友,即:

$odjezd = mysqli_real_escape_string($connection, $odjezd)
  

编码的字符是NUL(ASCII 0),\ n,\ r,\,&#39;,&#34;和Control-Z。

更新:

  

我使用了mysqli_real_escape_string,我仍然可以提交   &#34; {B}℃&#39; =%&#34;我希望它删除spec.characters和只是输入   ABC ......怎么样?

我们假设$odkud只能包含字母或数字,只有5个字符只能验证,我们可以使用preg_match()作为验证器,即:

$id  = $_REQUEST['id']; 
if (preg_match('/^[a-z\d]{5}$/i', $odkud)) {
    # Successful match
} else {
    # Match attempt failed
}

Live Regex Example & Explanation

如果你只需要删除特殊字符,请使用上面提到的一个php过滤器或preg_replace,即:

$odkud_filtered = preg_replace('/[^a-z\d]/i', '', $odkud);
# abc

Live Regex Example & Explanation

答案 1 :(得分:1)

你的主管只是要求你对待特殊字符。为此,@ Pedro的答案就足够了。

$odjezd = mysqli_real_escape_string($connection, $odjezd)     // copied from @Pedro’s answer

但如果您需要更多验证, 你可以查看日期的格式是否正确?

$test_arr  = explode('/', $POST[‘date’]);
if (count($test_arr) == 3) {
    if (checkdate($test_arr[0], $test_arr[1], $test_arr[2])) {
        // valid date ...
    } else {
        // problem with dates ...
    }
} else {
    // problem with input ...
}

同样,您可以根据所需方式验证数据。

this可能会有所帮助。