【问题标题】:PHP sql treat special charactersPHP sql 处理特殊字符
【发布时间】:2018-09-24 15:49:30
【问题描述】:
$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");
}

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

【问题讨论】:

  • 我认为这是关于验证。您直接使用变量运行查询,无需任何验证。因此,出于安全目的,您必须在运行查询之前验证数据,否则它将受到 sql 注入等安全威胁。所以,搜索如何验证请求
  • 如何验证?我的意思是,我有日期、时间和(城市的)名称 if(empty($datum)) { $errorMessage .= "
  • 你忘记输入日期了!
  • "; } if(empty($odkud)) { $errorMessage .= "
  • 您忘记输入城市名称!
  • "; } if(empty($odjezd)) { $errorMessage .= "
  • 你忘记输入 odjezd!
  • "; }
  • 检查我的答案
  • 标签: php sql insert


    【解决方案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、\、'、" 和 Control-Z。


    更新:

    我已经使用了 mysqli_real_escape_string 并且我仍然可以提交 "a{b}c'=%" 我希望它删除 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

    【讨论】:

      【解决方案2】:

      您的主管只是要求您对待特殊字符?。对此@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 可能会有所帮助。

      【讨论】:

      • 我有 $odjezd = mysqli_real_escape_string($connection, $_REQUEST['odjezd']);和佩德罗说的一样吗?
      • 是的,但是在这里您创建一个名为 $objezd 的新变量,并通过 mysqli_real_escape_string 分配返回值
      • 那么哪个是正确的?我的还是佩德罗斯的?
      • 两者。差别不大
      • 我已经使用了 mysqli_real_escape_string 并且我仍然能够提交 "a{b}c'=%" 我希望它删除 spec.characters 并只需输入 abc...如何?
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签