サイトの裏側にCMSを設定しようとしていますが、投稿データに_<a href=...
_が含まれていると、投稿データが破棄されます。
設定に_$config['global_xss_filtering'] = TRUE;
_があります
私の質問は、1つのアイテムのxssフィルタリングを無効にする方法はありますか?
例えば.
$this->input->post('content', true);
-オンにしますが、オフにする方法は?
みんな、ありがとう。
PVS
post()
メソッドのデフォルトの動作を変更したい場合は、コア入力ライブラリを拡張できます。怠惰な場合は、入力ライブラリの278行目(またはそれ以上)を次のように変更できます。
_/**
* Fetch an item from the POST array
*
* @access public
* @param string
* @param bool
* @return string
*/
function post($index = '', $xss_clean = TRUE)
{
return $this->_fetch_from_array($_POST, $index, $xss_clean);
}
_
ここでの唯一の違いは、$ xss_clean変数をTRUE
ではなくFALSE
に変更したことです。これで、グローバルXSSフィルタリングをオフにでき、入力ライブラリのpost()
メソッドの呼び出しで2番目のパラメーターとしてfalseを指定しない限り、入力が自動的にフィルター処理されます。 1つ下のメソッドはget()
メソッドであり、同じ方法で変更できます。
ただし、私があなたなら、ネイティブライブラリを拡張するだけです。CodeIgniterを更新するまでにこれを忘れてしまう可能性が高く、XSSが攻撃される理由が突然不思議に思うでしょう。 。これは次のようになります。
_class MY_Input extends CI_Input {
function My_Input()
{
parent::CI_Input();
}
function post($index = '', $xss_clean = TRUE)
{
return parent::post($index, $xss_clean);
}
}
_
ライブラリの拡張について詳しくは、こちらをご覧ください。
http://codeigniter.com/user_guide/general/creating_libraries.html
グローバル_xss_clean
_を有効にして、特定の場合にのみオーバーライドする場合は、入力ライブラリを拡張して、要求されたときに生データを提供するための_$_POST
_のクローンを保持できます。
_<?php if (!defined('BASEPATH')) exit('No direct access allowed.');
class MY_Input extends CI_Input {
public function __construct() {
$this->_POST_RAW = $_POST; //clone raw post data
parent::__construct();
}
public function post($index = null, $xss_clean = TRUE) {
if(!$xss_clean){ //if asked for raw post data -eg. post('key', false)-, return raw data. Use with caution.
return $this->_POST_RAW[$index];
}
return parent::post($index, $xss_clean);
}
}
?>
_
このようにして、_xss_clean
_がグローバルに有効になっている場合でも、$this->input->post('mydata', FALSE)
を使用してサニタイズされていない生の投稿データを取得できます。
私の場合、treefaceのソリューションは機能しませんが、別の方法を見つけました。 _ sanitize_globals()を使用してMY_Inputを作成し、POSTデータをサニタイズする場所に構築がある場合は追加しました。
// Clean $_POST Data
if (is_array($_POST) AND count($_POST) > 0) {
foreach ($_POST as $key => $val) {
if($this->_clean_input_keys($key) != 'my_none_sanitize_field')
$_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
}
}
私は定義しました
global $mypost;
$mypost=$_POST;
私のルートcmsのindex.phpで
その後、どこでも私はグローバル変数のようなことができます
global $mypost;
$var=isset($mypost["field"])? $mypost["field"]:"";
フィルタなしで投稿する必要があるときはいつでも。
それが役立つことを願って私のために働いた。
cI 2.2での作業treefaceのソリューションでは、input-> get()、input-> cookie()などがxss_cleanedされないままになると思います。 (get in oauthリクエストなどを使用します)。グローバル構成の変更により、コンストラクターによるエスケープが停止され、コアクラスはこれらのメソッドでデフォルトでxss_cleanをFALSEに設定します。
私は基本的に、より多くのメソッドにわたって同じソリューションを実装しました。
class MY_Input extends CI_Input {
/* fixes to allow xss_clean to be disabled on a per field basis
* [ e.g. tinymce html content with style / class / event attributes ]
* initial ref : http://stackoverflow.com/questions/3788476/codeigniter-disable-xss-filtering-on-a-post-basis
* this is based on CI 2.2
* the above (stackoverflow) solution only updates the post method - which means all the rest ( get, get_post, cookie, server, request_headers, get_request_header)
* NB : we need GET to allow oauth type activities !
*
* 1 - change the global config to xss_clean = false [ otherwise the constructor will 'xss_clean' everything before we have a chance to say no ! ]
* 2 - make all of methods that take the xss_clean parameter use TRUE as default value
* 3 - we can now pass the second parameter in as FALSE if we do not want to xss_clean
*/
function get($index = '', $xss_clean = TRUE)
{
return parent::get($index, $xss_clean);
}
function post($index = '', $xss_clean = TRUE)
{
return parent::post($index, $xss_clean);
}
function get_post($index = '', $xss_clean = TRUE)
{
return parent::get($index, $xss_clean);
}
function cookie($index = '', $xss_clean = TRUE)
{
return parent::cookie($index, $xss_clean);
}
function server($index = '', $xss_clean = TRUE)
{
return parent::server($index, $xss_clean);
}
function request_headers($xss_clean = TRUE)
{
return parent::request_headers($xss_clean);
}
function get_request_header($index, $xss_clean = TRUE)
{
return parent::get_request_header($index, $xss_clean);
}
}
これが誰かの助けになることを願っています
はい、postメソッドを置き換えたInputの拡張機能は非常に便利でした。また、親:: post($ index、$ xss_clean)を返す必要があることに気付いた賢明な読者も同様でした。エラーが発生していて、その明らかなエラーについては考えていませんでした。それを修正し、私はオフにして実行しています。
SQLステートメントで使用するために投稿データをエスケープするために使用しています。 CIのdbメソッドは素晴らしいですが、手作業でコーディングするのが簡単な大きなsqlステートメントがいくつかあります。