- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我继承了一个庞大且漏洞百出的 PHP 代码库。它需要彻底审查和清理,但同时我需要权宜之计。从长远来看,它需要适当的用户输入 sanitizer ,例如根据 What's the best method for sanitizing user input with PHP? .然而,这在短期内是不切实际的。它是一个由数千个文件组成的代码库,包含数十万行代码,我需要某种方法来尽快阻止大部分错误。
许多脚本使用 $_GET['id']
作为数据库查找的未经处理的参数。有没有办法让 PHP 沿着这些行自动预处理 $_GET
数组:
if( isset( $_GET['id'] ) )
$_GET['id'] = (int) $_GET['id'];
我很清楚:
然而,它会阻止 99% 的问题,并为我赢得一些急需的喘息空间。如果可能的话,我更愿意在 PHP 配置等中全局进行。非常感谢您的任何建议。
编辑:下面是我通过自动添加拼凑在一起的一些代码,以防对其他人有用。您需要替换数据库用户名、密码,可能还需要替换字符集。除了 $_GET
和 $_POST
,您可能还想净化 $_REQUEST
、$_SESSION
和$_COOKIE
超全局变量。包含调试代码用于测试目的。请注意,这只是一个权宜之计,不是以替代正确的输入清理!再次感谢所有提供建议的人。
<?php
$debug = false;
if( $debug ) ini_set( 'display_errors', 1 );
if( !function_exists( '_sanitise' ) )
{
function _sanitise( $input )
{
return htmlspecialchars( $input, ENT_QUOTES, 'UTF-8' );
}
}
if( !function_exists( '_sanitise_sql' ) )
{
function _sanitise_sql( $input )
{
$mysqli = new mysqli( 'localhost', 'username', 'password', 'database' );
/*if( mysqli_connect_error() )
{
echo 'Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error();
}*/
$mysqli->set_charset( 'utf8mb4' );
if( is_array( $input ) )
{
$result = array();
foreach( $input as $key => $value )
{
$result[$key] = _sanitise_sql( $value );
}
return $result;
}
else return $mysqli->real_escape_string( $input );
}
}
if( !isset( $_GET['_sanitised'] ) )
{
foreach( $_GET as $key => &$value )
{
if( mb_strtolower( $key ) === 'id' ) $value = (int) $value;
elseif( substr( mb_strtolower( $key ), -3 ) === '_id' ) $value = (int) $value;
else $value = _sanitise_sql( $value );
}
$_GET['_sanitised'] = true;
}
if( !isset( $_POST['_sanitised'] ) )
{
foreach( $_POST as $key => &$value )
{
if( mb_strtolower( $key ) === 'id' ) $value = (int) $value;
elseif( substr( mb_strtolower( $key ), -3 ) === '_id' ) $value = (int) $value;
else $value = _sanitise_sql( $value );
}
$_POST['_sanitised'] = true;
}
if( $debug )
{
echo '<pre>$_GET:' . PHP_EOL;
echo _sanitise( print_r( $_GET, true ) );
echo PHP_EOL . '$_POST:' . PHP_EOL;
echo _sanitise( print_r( $_POST, true ) );
echo '</pre>';
}
最佳答案
您可以为每个请求添加一个文件 auto-prepend-file在你的 php.ini
auto_prepend_file = /path/of/your/file.php
然后在这里进行您想要的所有 sanitizer 。
Specifies the name of a file that is automatically parsed before the main file. The file is included as if it was called with the require function, so include_path is used.
关于php - 预处理 PHP $_GET 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34179445/
PHP 内置了 _get 和 _set 函数。是为每个变量编写自己的 get 和 set 函数更好,还是使用带有大量 if else if 的内置函数?每种方法的优缺点是什么? 最佳答案 __get
这个问题可能看起来很相似,但请理解我的问题。在我的更新页面中,我对 $_GET 方法感到困惑。在我的第一页中,我提供了一个像这样编辑表格的链接 index.php "; e
我最近被安排做一个需要一些PHP的项目,我对PHP了解不多。站点中有几个实例,单击按钮后,用户会被重定向到带有一些 URL 参数的另一个页面。然后下一页使用 $_GET 获取这些参数并继续。 代码中的
我想要一些奇怪的东西。如果有人打开 index.php 页面,$select 必须是 full,。但如果有人打开 index.php?var=4 page,$select 必须是 other,带有 v
假设我有一个类似于 www.mysite.com/index.php?login=0 的 URL。是否可以切换大小写 $_GET 的变量和切换大小写 $_GET 的变量值? 类似于: switch (
我希望扩展我的 PHP 知识,但我遇到了一些我不确定它是什么或什至不知道如何搜索它的东西。我正在查看 php.net isset 代码,我看到了 isset($_GET['something']) ?
为了在 PHP 中读取未知变量,我经常使用如下代码: $bar = isset($_GET['foo']['bar']) ? $_GET['foo']['bar'] : NULL; 我不喜欢把变量名写
这个问题已经有答案了: How can I prevent SQL injection in PHP? (27 个回答) 已关闭 7 年前。 我在数据库中有一个(主题)和(页面)表。 page TAB
我正在尝试制作一个类似的搜索引擎,对于我的网站来说很简单。这是我正在使用的代码: $sql = mysql_query("SELECT * FROM books WHERE tags LIKE '
您好,我正在编写个人资料页面脚本,在此脚本中,我检查传入的 $_GET 变量的值并验证它是一个整数,然后我根据 $_SESSION 值验证此值以确认他们只能访问自己的帐户.代码如下所示: // val
我在这里检查了所有可能的解决方案,不幸的是它不起作用。我的代码似乎有什么问题? 我尝试了以下方法。 url解码 ( http://php.net/manual/en/function.urldecod
我有一个 test.php 并且我有下面的代码 我在下面列出了 url,然后显示了所需的输出 Test 1 : http://localhost/example/test.php output :
我有以下登录脚本,我确实在其中使用了 session 。 query("SELECT * FROM table WHERE x1='".$x1."' AND x2='".$x2."'");
实际上这是我的代码: echo ""; // get current vars $p1 = isset($_GET['p1']) ? trim($_GET['p1']) : false; $p2 =
我正在 Adobe Dreamweaver 中编写 PHP 代码。我的代码如下所示。我期待我的代码输出两个框,我在其中写了一些东西。当我单击提交按钮时,我希望看到我在框中输入的两个单独的内容被连接
我假设 $_GET 变量被解释为单引号字符串(而不是双引号字符串)。 我相信这是真的,因为以下测试(我自己尝试进行目录遍历攻击): $file = "../test.php"; /** * same
我有一个 test.php 并且我有下面的代码 我在下面列出了 url,然后显示了所需的输出 Test 1 : http://localhost/example/test.php output :
我需要使用 get 函数从 url 中检索 $title 变量。 $title=$_GET["title"]; $title 稍后在 MySQL 查询中使用。 问题是如何保证安全?换句话说,如何消除通
我不明白为什么有人在代码中使用 @,我在 mysql 连接中看到过它,但我不知道它是什么意思..谢谢! $player_name_orig = @$_GET['player']; if (!$play
我要问两件事。 第一个问题是我这样做是否正确?我正在将一个链接与 javascript 变量放在一起 http://google.com/test.php?var="+class4 然后我使用 php
我是一名优秀的程序员,十分优秀!