阅读 Robin Nixon 的学习 PHP、MySQL 和 JavaScript 时提出的问题 RE:清理输入 PHP [重复]

Posted

技术标签:

【中文标题】阅读 Robin Nixon 的学习 PHP、MySQL 和 JavaScript 时提出的问题 RE:清理输入 PHP [重复]【英文标题】:Question while reading Learning PHP, MySQL & JavaScript by Robin Nixon RE: Sanitizing Input PHP [duplicate] 【发布时间】:2016-10-31 05:59:02 【问题描述】:

我目前正在从一本书中阅读和学习 php,这本书提供了清理表单输入的正确方法:

function mysql_entities_fix_string($connection, $string) 

return htmlentities(mysql_fix_string($connection, $string));


function mysql_fix_string($connection, $string)

  if (get_magic_quotes_gpc()) $string = stripslashes($string);
  return $connection->real_escape_string($string);

这很好,除了我知道get_magic_quotes_gpc() 在当前版本的 PHP 中已被弃用。通过查看一些不同的资源,我了解到我应该只使用 sql 准备语句,而不是使用 get_magic_quotes_gpc()。这让我很困惑,因为我认为我们仍然需要对字符串进行一些功能性清理。

除非我错了(发生这种情况,我对此比较陌生)这是一个很大的禁忌,无论准备好的声明如何:

$username = $_POST['username'];
$stmt = $conn->prepare("SELECT password FROM users WHERE username=?");
$stmt->bind_param("s", $username");
$stmt->execute();
...

但如果是这样的话,这是一个可接受的卫生过程吗:

function get_post($conn, $var) 
return $conn->real_escape_string($_POST[$var]);

...
$username = get_post($conn, 'username');
$stmt = $conn->prepare("SELECT password FROM users WHERE username=?");
$stmt->bind_param("s", $username);
$stmt->execute();
...

或者我需要在上面添加一些其他转义功能吗?

【问题讨论】:

使用准备好的语句不要做任何其他事情。 准备好的声明否定了这种消毒的需要。您仍然可以检查您不想包含在数据中的其他内容,但您不必保护查询本身免受它的影响。人们必须“清理”数据的原因是因为他们会将其直接连接到查询中,从而将这些数据视为可执行代码。带有查询参数的预处理语句不会将值作为代码执行,因此问题变得没有实际意义。 用凝固汽油弹烧掉那本书,然后拿回你的钱。 不知道为什么用户 @zfrisch 没有命名他们正在使用的书。这是 Robin Nixon 的“Learning PHP, MySQL & javascript”(我知道是因为我在阅读本书时思考了这个问题后来到这里);亚马逊上评价最高的 PHP 书籍之一。如果他们具体说明了哪本书,那么这个问题不应被标记为重复,而是将作为来自经验丰富的 PHP 用户的上述书的当前和未来读者关于该书的重要问题的澄清' t 完全清楚。 @DeltaFlyer 好吧,它是问题标题:) 【参考方案1】:

呃,不。那个清理代码是垃圾。

您建议的带有 PDO 语句的清理过程很好。这就是你所需要的。

【讨论】:

还有什么要说的? 谢谢娜奥米克。这正是我需要知道的。从 cmets 的强烈反对来看,我可能会开始寻找更新的书,哈哈。这是从 2014 年 11 月开始的,所以我认为它不会那么差。 使用外部资源将大大提高您的回答质量。解释事情的原因也可能导致同样的效果。不管怎样,这正是我从how-to-answer 那里得到的 ^^

以上是关于阅读 Robin Nixon 的学习 PHP、MySQL 和 JavaScript 时提出的问题 RE:清理输入 PHP [重复]的主要内容,如果未能解决你的问题,请参考以下文章

查找加密资产 robin_stocks 的功能

前端如何优雅处理类数组对象?

负载均衡算法之轮询(Round Robin)法和随机(Random)法 Java 代码实现方法学习

RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)

记录一下我的2017年阅读书单

云原生存储初创公司 Robin获得3500万美元融资