相关疑难解决方法(0)

如何在PHP中阻止SQL注入?

如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:

$unsafe_variable = $_POST['user_input']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)

这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)

可以采取哪些措施来防止这种情况发生?

php mysql sql security sql-injection

2776
推荐指数
28
解决办法
166万
查看次数

是否使用"SET NAMES"

在阅读O'Reilly的"高性能MySQL"时,我偶然发现了以下情况

另一个常见的垃圾查询是SET NAMES UTF8,这是一种错误的做事方式(它不会改变客户端库的字符集;它只影响服务器).

我有点困惑,因为我曾经在每个脚本的顶部放置"SET NAMES utf8"让db知道我的查询是utf8编码的.

任何人都可以评论上述引用,或者,更正式地说,您的建议/最佳实践是什么,以确保我的数据库工作流是unicode意识.

如果这是相关的,我的目标语言是php和python.

php python mysql internationalization

60
推荐指数
3
解决办法
5万
查看次数

我在PHP应用程序中正确支持UTF-8吗?

我想确保我所知道的关于UTF-8的一切都是正确的.我一直试图使用UTF-8一段时间,但我不断遇到越来越多的错误和其他奇怪的事情,这使得看起来几乎不可能拥有100%的UTF-8网站.我似乎总是想念一个地方.也许这里有人可以纠正我的清单或者确定它,所以我不会错过任何重要的事情.

数据库

每个站点都必须在某处存储数据.无论您的PHP设置是什么,您还必须配置数据库.如果您无法访问配置文件,请确保在连接后立即" 设置名称'utf8' ".另外,请确保在所有表上使用utf8_ unicode_ ci.这假设MySQL是一个数据库,你必须为其他人改变.

正则表达式

我做了很多比你的普通搜索替换更复杂的正则表达式.我必须记住使用"/ u"修饰符,以便PCRE不会破坏我的字符串.然而,即便如此,显然仍然存在问题.

字符串函数

所有默认字符串函数(strlen(),strpos()等)都应该用多字节字符串函数替换,它们查看字符而不是字节.

标题 您应确保您的服务器返回正确的浏览器标题,以了解您尝试使用的字符集(就像您必须告诉MySQL).

header('Content-Type:text/html; charset = utf-8');

将正确的<meta>标记放在页眉中也是一个好主意.虽然实际的标题会覆盖它,但它们应该不同.

<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

问题

我是否需要在页面加载时将我从用户代理(HTML表单和URI)收到的所有内容转换为UTF-8,或者我是否可以保留字符串/值,并且仍然可以通过这些函数运行它们而不会出现问题?

如果我确实需要将所有内容转换为UTF-8 - 那么我应该采取哪些步骤?mb_detect_encoding似乎是为此而建的,但我一直看到人们抱怨它并不总是有效.mb_check_encoding似乎也有问题从一个格式错误的字符串中告诉一个好的UTF-8字符串.

PHP是否会根据所使用的编码(如文件类型)以不同的方式将字符串存储在内存中,或者它是否仍然像常规字符串一样存储,其中某些字符的解释方式不同(例如& vs&in HTML). chazomaticus回答了这个问题:

在PHP中(无论如何最多为PHP5),字符串只是字节序列.没有与之相关的隐含或显式字符集; 这是程序员必须跟踪的东西.

如果给mb_*函数一个非UTF-8字符串会导致问题吗?

如果UTF字符串编码不正确会出错(比如正则表达式中的解析错误?)或者它只是将实体标记为坏(html)?有不正确编码的字符串是否有可能导致函数返回FALSE,因为字符串不好?

我听说你应该把你的表格标记为UTF-8(accept-charset ="UTF-8"),但我不确定它的好处是什么......?

编写UTF-16是为了解决UTF-8的限制吗?就像UTF-8用尽人物的空间一样?(Y2(UTF)K?)

功能

以下是我发现的一些自定义PHP函数,但我无法验证它们是否真正有效.也许某人有一个我可以使用的例子.首先是convertToUTF8(),然后是来自wordpress的seem_utf8.

function seems_utf8($str) {
    $length = strlen($str);
    for ($i=0; $i < $length; $i++) {
        $c = ord($str[$i]);
        if ($c < 0x80) $n = 0; …
Run Code Online (Sandbox Code Playgroud)

php unicode utf-8

40
推荐指数
2
解决办法
3314
查看次数

调试PDO mySql将NULL插入数据库而不是空

我试图使用PDO动态地将'NULL'插入数据库.

表结构:

CREATE TABLE IF NOT EXISTS `Fixes` (
  `Id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'PK',
  `CurrencyId` int(11) NOT NULL COMMENT 'FK',
  `MetalId` int(11) NOT NULL COMMENT 'FK',
  `FixAM` decimal(10,5) NOT NULL,
  `FixPM` decimal(10,5) DEFAULT NULL,
  `TimeStamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`Id`),
  KEY `CurrencyId` (`CurrencyId`),
  KEY `MetalId` (`MetalId`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=13 ;
Run Code Online (Sandbox Code Playgroud)

PHP/PDO QUERY:

$sql = 'UPDATE 
            Fixes
    SET 
            FixAM = :fixAM,
        FixPM = :fixPM
        WHERE
            MetalId IN (SELECT Id FROM …
Run Code Online (Sandbox Code Playgroud)

php mysql null pdo insert

4
推荐指数
1
解决办法
803
查看次数