当我创建输入
时<input type="text" name="456" value="123">
并将该数据传递到另一个php站点,Wordpress会自动添加反斜杠,如:
\"my text\"
但我需要以下列方式提供文字:
"my text".
这就是我在进一步处理数据之前使用该功能的原因:
stripslashes()
这是否是针对黑客行为的不安全解决方案?至关重要的是要知道,因为我通过API发送密码。
答案 0 :(得分:1)
应该是安全的。
根据http://fearlessflyer.com/getting-rid-of-unwanted-backslashes-in-wordpress-form-input/
根据PHP.net:Magic Quotes自版本5.3起已被弃用,不会成为未来版本的一部分。
请参阅:http://php.net/manual/en/security.magicquotes.disabling.php
快速回答 将其添加到您的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 );
}
?>
答案 1 :(得分:0)
我猜这不是WordPress,而是你的PHP安装启用了魔术引号。你应该修改你的php.ini来禁用魔术引号。魔术行情是邪恶的!
http://php.net/manual/en/security.magicquotes.disabling.php
从PHP 5.3开始,Magic Quotes已被弃用,并且已完全从PHP 5.4中删除。
<强>更新强> 我从来没有听说过striplashes受到损害。它是一个字符串,它将成为一个字符串,在出路时减少斜线。所以,如果你不能关闭魔术引号,那么我会使用stripslashes来删除$ _POST中的引号,等等。如果你担心其他插件受到你删除斜线的影响(虽然我会感到惊讶,然后你可以做这样的事情:
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;
}
}
然后,您可以访问您的vars:Http::instance()->get('myvar');
。执行此操作后,您只需要在执行SQL操作,mail()标头等之前正确清理输入,这可能是进行注入的地方。对于DB,您应该使用类似mysql_real_escape_string(legacy)或Pdo :: quote()(当前)的内容。这些方法采用DB上下文并正确地清理THAT DB的数据,这比同样的东西更安全。
就个人而言,我宁愿禁用魔法引号。但是,如果你不能这样做,这种方法应该有效。
答案 2 :(得分:0)
对于将来的读者,以前的答案是直接的错误。根据{{3}}的评论,WordPress在内部强制执行等效的魔术引号,以确保一致的输入,向后兼容性,并保护新手以免损害WP安装。这是过去的糟糕时光的一个宿醉,当时人们很普遍地将数据直接插入数据库而无需任何清理/验证,然后仅针对他们所看到的问题而不是正确地编写骇人的解决方法。
在您的数据上使用stripslashes()
和stripslashes_deep()
是安全的,只要您正确地将所有未转义的数据通过$wpdb->insert()
,{{ 1}}等保存到数据库中。 从不取消转义(如$wpdb->prepare()
之类有望被转义的超全局变量,请使用副本。人们通常希望您能逃脱现实,这就是为什么看到很多反斜杠会乱扔WP内容的原因。
这与转义html输出是完全分开的,应始终在不受信任的用户输入上完成html输出。