我怎样才能更好地保护我的恶意用户的php,jquery,ajax请求

Bri*_*ian 12 php security jquery

我通过jquerys getJSON方法发送了大量数据,一个函数的例子是

function doSomething(sid){
    if(sid){

    $.getJSON("ajax/ajaxDoSomething.php",{sid:""+sid+""}, function(data){
        //alert(data);
        if(data.success == true){
            $('#add_vote_div').html('vote received');
            $('#list_data_div').html(data.html);
        }
        else{
            $('#add_vote_div').html(data.message);
        }
    });
  } 
}`
Run Code Online (Sandbox Code Playgroud)

问题是任何人都可以查看源代码并查看发送GET数据的php文件的位置,因此您可以将浏览器指向该位置并将数据附加到URL.我检查数据以确保其正确的数据类型,但我不希望用户能够转到网址.

我想也许把所有的ajax文件放在主文档根目录后面会起作用但是jquery不能链接到绝对路径之类的

$.getJSON("var/www/ajax/doSomething.php",{sid:""+sid+""}
Run Code Online (Sandbox Code Playgroud)

(主文件根目录是var/www/html /)

如果他们制作了一个更好的$ .postJSON,但它不存在,任何想法?

Dam*_*S8N 18

您需要做的是针对几种特定类型的攻击.即使是非常引人注目的网站,这通常也足够了.对于一个不是最大的网站之一的网站,这些东西应该足以阻止脚本小子.

跨站请求伪造:

从本质上讲,这是您在初始帖子中试图指出的内容.正如您所指出的那样,这种攻击所需要的是,找出可以实现某些特定于用户的操作并直接调用它的URL.或者,更难以防范,通过欺骗登录用户点击导致该用户特定操作的链接来完成.

可以通过使用会话密钥标记每个呼叫并确保其有效来阻止第一种呼叫.但是,这不能阻止第二个.

好消息是,这个攻击可以通过一个秘密值来停止,这个秘密值是url的一部分,经常更改,会在后端记住足够长的时间以确保它被正确调用.我们在这里讨论AJAX,所以最简单的方法是在整页加载时创建一个随机数密码值.对于传统表单也是如此,记住这一点并在创建新的秘密值之前检查旧的秘密值.您在会话数据中保存此值,并将其附加到所有AJAX调用或从后续页面中提交提交.如果匹配,则它是同一个用户.如果没有,您只需忽略该请求.

每次用户加载整个新页面时,都会为该用户创建一个新秘密.这意味着只有攻击者是用户,他们才能找到这个值.这意味着你已经击败了这种攻击类型.

跨站脚本:

XSS攻击的不同之处在于它们是CSRF攻击的另一面.这个很容易.只需确保来自用户或数据库的所有数据都通过某些函数传递,该函数会将html字符转换为其实体(如htmlentities()PHP),然后再在您的站点上显示.这样做会阻止用户使用JavaScript将用户重定向到操作链接或其他恶意内容.它还可以防止flash和其他对象嵌入到页面中.

不幸的是,它还会阻止在评论或文章正文中使用任何HTML.这可以使用非常严格的白色标签列表或替代代码的某些版本.(比如本网站使用)

确实没有好方法可以尝试创建黑名单.我试过了.我们都试过了.它们不起作用.

SQL注入:

我不会在这里详细说明,但是,足以说上述攻击与这可能造成的伤害相比毫无意义.了解它.

除此之外,您应遵循一些指导原则.比如永远不要陷入相信你发送到javascript的数据将会回归你期望的陷阱.假设最坏的情况.传统形式也是如此.无论您如何加密,都应该处理发送给用户的数据,就好像它是来自用户的全新数据一样.

如果您有论坛帖子的编辑方法.检查提交用户是否有权编辑该帖子.确保他们已登录.确保密码匹配.确保他们输入的数据没有SQL注入.

做这些事情,你就会停止绝大多数攻击.

不是所有的人.FireSheep使用的攻击类型仍然可以通过,针对用户而不是您的站点的任何类似攻击也会通过.您可以使用https而不是http来防范FireSheep.但即使这样也无法抵御各种用户定位攻击.比如从他们的机器上窃取会话cookie,或者对他们的机器进行物理访问.


T.J*_*der 3

它只会稍微提高黑客攻击的门槛,但您可以jQuery.ajax通过(这是一个链接)或jQuery.post(就是这样)发布 JSON 。只是( 和)jQuery.getJSON的包装。来自文档ajax.post.getgetJSON

这是一个简写的 Ajax 函数,相当于:

$.ajax({
    网址: 网址,
    数据类型:'json',
    数据:数据,
    成功:回调
});

因此,要实现您的postJSON概念,您只需type向其添加一个参数:

$.ajax({
    url:      url,
    type:     'POST',   // <== the new bit
    dataType: 'json',
    data:     data,
    success:  callback
});
Run Code Online (Sandbox Code Playgroud)

如果您确实愿意,可以将 a 添加postJSONjQuery对象,预处理参数,然后调用$.ajax. 这基本上是jQuery 源代码的复制粘贴,但切换.get.post

if (!jQuery.postJSON) {
    jQuery.postJSON = function( url, data, callback ) {
        return jQuery.post(url, data, callback, "json");
    };
}
Run Code Online (Sandbox Code Playgroud)

请注意,伪造 POST 仍然很容易。不像 GET 那么容易,但仍然很容易。

  • 如果恶意用户不将自己的数据提交到 PHP 文件很重要,那么这个解决方案就没用了 - 它只会阻止那些懒得使用 cURL 的黑客。 (2认同)
  • @Brian:对于那些知道自己在做什么和/或拥有可以做的工具的人来说,这真的非常容易。基本上,您必须将*所有*传入的用户输入视为可能受到损害、伪造和/或恶意。您尽最大努力进行服务器端验证,保留并监控日志,保留备份,并在完成后获得最好的结果。:-) (2认同)