gpt4 book ai didi

php - 预处理 PHP $_GET 变量

转载 作者:可可西里 更新时间:2023-11-01 08:27:20 26 4
gpt4 key购买 nike

我继承了一个庞大且漏洞百出的 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'];

我很清楚:

  • 这不是一个正确的修复,只是一个拼凑。
  • 我可以使用某种查找和替换功能将它放在每个文件的顶部。
  • 几乎肯定还有其他未经处理的 SQL 输入问题。
  • 代码应该使用准备好的语句。

然而,它会阻止 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com