在wordpress中使用stripslashes()是否不安全?
当我创建输入时在wordpress中使用stripslashes()是否不安全?,wordpress,security,Wordpress,Security,当我创建输入时 <input type="text" name="456" value="123"> 但我需要以下方式的文本: "my text". 这就是我在进一步处理数据之前使用该函数的原因: stripslashes() 这是针对黑客攻击的不安全解决方案吗?知道这一点至关重要,因为我通过API发送密码。这应该是安全的 据 根据PHP.net的说法:从5.3版开始,Magic Quotes就被弃用了,不会成为未来版本的一部分 见: 快速回答 将此添加到您的PHP中: &
<input type="text" name="456" value="123">
但我需要以下方式的文本:
"my text".
这就是我在进一步处理数据之前使用该函数的原因:
stripslashes()
这是针对黑客攻击的不安全解决方案吗?知道这一点至关重要,因为我通过API发送密码。这应该是安全的
据
根据PHP.net的说法:从5.3版开始,Magic Quotes就被弃用了,不会成为未来版本的一部分
见:
快速回答
将此添加到您的PHP中:
<?php
if ( get_magic_quotes_gpc() ) {
$_POST = array_map( 'stripslashes_deep', $_POST );
$_GET = array_map( 'stripslashes_deep', $_GET );
$_COOKIE = array_map( 'stripslashes_deep', $_COOKIE );
$_REQUEST = array_map( 'stripslashes_deep', $_REQUEST );
}
?>
我猜这不是WordPress,而是您安装的启用了魔术引号的PHP。您应该修改php.ini以禁用魔术引号。魔法格言是邪恶的 从PHP5.3开始,魔法引号就被弃用,并从PHP5.4中完全删除 更新 我从来没有听说过脱衣舞被破坏。这是一个正在输入的字符串,它将是一个在输出时带有较少斜线的字符串。因此,如果您无法关闭magic quotes,那么我将使用stripslashes从$\u帖子中删除引号,等等。如果您担心删除slashes会影响其他插件(尽管我会感到惊讶),那么您可以这样做:
class Http {
private $_instance;
private $_post;
private $_get;
private $_cookie;
private $_request;
//singleton pattern to avoid parsing multiple times.
public static function instance() {
if( is_null($this->_instance) ) {
$this->_instance = new self();
}
return $this->_instance;
}
private function __construct() {
$isMagicQuotesOn = get_magic_quotes_gpc();
$this->_post = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_POST ) : $_POST;
$this->_get = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_GET ) : $_GET);
$this->_cookie = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_COOKIE ) : $_COOKIE;
$this->_request = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_REQUEST ) : $_REQUEST;
}
public function removeMagic( $value ) {
return is_array($value) ? array_map(array($this,'removeMagic'), $value) : stripslashes($value);
}
public function get( $var ) {
return isset($this->_get[$var]) ? $this->_get[$var] : null;
}
public function post( $var ) {
return isset($this->_post[$var]) ? $this->_post[$var] : null;
}
public function cookie( $var ) {
return isset($this->_cookie[$var]) ? $this->_cookie[$var] : null;
}
public function request( $var ) {
return isset($this->_request[$var]) ? $this->_request[$var] : null;
}
}
然后,可以通过以下方式访问变量:Http::instance()->get('myvar')代码>。一旦您这样做了,那么您只需要在执行SQL操作、mail()头等之前对输入进行适当的清理,这是可能发生注入的地方。对于DB,应该使用类似mysql_real_escape_string(遗留)或Pdo::quote()(当前)。这些方法采用DB上下文并正确清理该DB的数据,这比addslashes更安全
就我个人而言,我宁愿禁用魔法引号。但是如果你不能做到这一点,这种方法应该是有效的。对于未来的读者来说,前面的答案是完全错误的。根据per的评论,WordPress在内部强制执行与magic quotes等效的命令,以确保一致的输入、向后兼容性,并保护新手不受WP安装的影响。这是过去糟糕日子的宿醉™ 当人们在不进行任何清理/验证的情况下直接将数据插入数据库时,通常只针对他们看到的问题编写黑客解决方案,而不是正确地执行
在数据上使用stripslashes()
和stripslashes_deep()
是安全的,只要您在将数据保存到数据库时正确地通过$wpdb->insert()
,$wpdb->prepare()
等传递任何未扫描的数据永不将未转义的数据写入超全局变量,如$\u POST
,这些变量应保持转义状态,使用副本,如$my\u POST=stripslashes\u deep($\u POST)代码>。大多数人都希望你能自己逃避,这就是为什么过去经常看到很多反斜杠乱扔WP内容的原因
这与html输出转义完全不同,html输出转义应始终在不受信任的用户输入上完成。实际上,一些插件可能依赖这些神奇的引号。批量删除它们可能会使您容易受到SQL注入之类的漏洞的攻击。@Gumbo,没有一个由程序员编写的WordPress插件会依赖于特定于系统的魔法引号。几乎所有我见过的magic quotes代码都是检查它是否打开,然后删除它们,这样你的插件就可以移植了……任何程序都不应该依赖它们的存在……这是一个巨大的安全风险。@KevinNelson甚至有几次。@Gumbo,问题不在于addslashes……当你自己运行addslashes时,这很好。你确切地知道发生了什么,而且它是便携式的。当您依赖于在分布式应用程序中启用的特定于系统的magic quotes配置时,就产生了安全问题。这就是为什么magic quotes被弃用的原因……它会鼓励糟糕的编程。@KevinNelson:您认为使用stripslashes($_POST['XYZ'])的解决方案怎么样;每当我在php站点上捕获$_POST['XYZ'],并且需要不带斜杠的变量时。您认为这是安全的还是有人使用我的变量$_POST['XYZ']发送了一些恶意代码,stripslashes()实际上使这些恶意代码复活。WordPress模仿魔术引号实现向后兼容,即使在PHP中禁用了它--
class Http {
private $_instance;
private $_post;
private $_get;
private $_cookie;
private $_request;
//singleton pattern to avoid parsing multiple times.
public static function instance() {
if( is_null($this->_instance) ) {
$this->_instance = new self();
}
return $this->_instance;
}
private function __construct() {
$isMagicQuotesOn = get_magic_quotes_gpc();
$this->_post = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_POST ) : $_POST;
$this->_get = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_GET ) : $_GET);
$this->_cookie = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_COOKIE ) : $_COOKIE;
$this->_request = $isMagicQuotesOn ? array_map( array($this,'removeMagic'), $_REQUEST ) : $_REQUEST;
}
public function removeMagic( $value ) {
return is_array($value) ? array_map(array($this,'removeMagic'), $value) : stripslashes($value);
}
public function get( $var ) {
return isset($this->_get[$var]) ? $this->_get[$var] : null;
}
public function post( $var ) {
return isset($this->_post[$var]) ? $this->_post[$var] : null;
}
public function cookie( $var ) {
return isset($this->_cookie[$var]) ? $this->_cookie[$var] : null;
}
public function request( $var ) {
return isset($this->_request[$var]) ? $this->_request[$var] : null;
}
}